index.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import { useRouter } from "vue-router";
  4. import { PageSearch, usePageSearch } from "/@/components/PageSearch";
  5. import { PageContent } from "/@/components/PageContent";
  6. import searchFormConfig from "./config/search.config";
  7. import contentConfig from "./config/content.config";
  8. import PagePower from "/@/components/PagePower/PagePower.vue";
  9. import { usePermission } from "/@/hooks/core/usePermission";
  10. import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
  11. import ExeclUploadModal from "./../_component/execl-files-upload/index.vue";
  12. import ProcureImport from "./../_component/procure-import/index.vue";
  13. import { template, procureTemplate } from "./../_config/xls-template";
  14. import { utils, writeFile } from "xlsx";
  15. import { ElMessage } from "element-plus";
  16. import { useUserInfo } from "/@/hooks/core/useUser";
  17. import { httpRequsetExport } from "/@/utils/export";
  18. import dayjs from "dayjs"
  19. import { useCompany } from "/@/hooks/core/useCompany";
  20. const execlUploadModalRef = ref<InstanceType<typeof ExeclUploadModal>>(null);
  21. const procureUploadModalRef = ref<InstanceType<typeof ProcureImport>>(null);
  22. const { permissions, hasPermissionWithCode } = usePermission("consultingCost");
  23. const selects = ref([]);
  24. const { pageContentRef, handleResetClick, handleSearchClick } = usePageSearch(
  25. undefined,
  26. undefined,
  27. searchFormConfig
  28. );
  29. const { push } = useRouter();
  30. const { isSuperUser } = useUserInfo();
  31. const { currentCompany } = useCompany()
  32. function toDetail(spuCode) {
  33. push({
  34. path: "/InvoiceSaleSettings/consultingCostDetail",
  35. query: { id: spuCode }
  36. });
  37. }
  38. const mapTag = {
  39. "1": "免税",
  40. "2": "不征税",
  41. "3": "零税率"
  42. };
  43. const mapDiscount = {
  44. "1": "是",
  45. "0": "否"
  46. };
  47. function onDownloadTemplate(isProcure = false) {
  48. if (selects.value.length === 0) {
  49. ElMessage.warning("请选择至少一个商品");
  50. return;
  51. }
  52. const judieTemplate = isProcure ? procureTemplate : template
  53. const judieFilename = isProcure ? "批量设置采购类目模板" : "批量设置财务类目模板"
  54. const data: any[] = [];
  55. selects.value.forEach((item) => {
  56. const _template = { ...judieTemplate };
  57. if (isProcure) { // 采购
  58. _template["商品编码"] = item.spuCode;
  59. _template["商品名称"] = item.good_name;
  60. _template["买入方公司编码"] = item.supplierNo;
  61. _template["买入方公司名称"] = item.supplierName;
  62. _template["卖出方公司编码"] = item.cgd_supplierNo;
  63. _template["卖出方公司名称"] = item.cgd_supplierName;
  64. _template["开票商品名称"] = item.cgd_inv_good_name;
  65. } else { // 财务
  66. _template["商品编码"] = item.spuCode;
  67. _template["商品名称"] = item.good_name;
  68. _template["买入方公司编码"] = item.supplierNo;
  69. _template["买入方公司名称"] = item.supplierName;
  70. _template["卖出方公司编码"] = item.cgd_supplierNo;
  71. _template["卖出方公司名称"] = item.cgd_supplierName;
  72. _template["采购类目编码"] = item.cgd_inv_cat_code;
  73. _template['采购类目名称'] = item.cgd_inv_cat_name;
  74. _template["采购开票商品名称"] = item.cgd_inv_good_name;
  75. _template['采购税率'] = item.cgd_inv_tax ? (((item.cgd_inv_tax.split("%"))[0]) / 100).toFixed(2) : "";
  76. _template['财务类目编码'] = item.inv_cat_code;
  77. _template['财务类目名称'] = item.inv_cat_name;
  78. _template['财务开票商品名称'] = item.inv_good_name;
  79. _template['财务税率'] = item.inv_tax ? (((item.inv_tax.split("%"))[0]) / 100).toFixed(2) : ""
  80. _template['税率标识'] = item.inv_tag && item.inv_tag !== "0" ? mapTag[item.inv_tag] : "";
  81. _template["是否有优惠政策"] = Number(item.status) >= 2 ? mapDiscount[item.is_discount] : "";
  82. _template["增值税管理内容"] = item.addTax;
  83. }
  84. data.push(_template);
  85. });
  86. //创建数据表
  87. const workBook = utils.book_new();
  88. const workSheet = utils.json_to_sheet(data);
  89. utils.book_append_sheet(workBook, workSheet, "sheet");
  90. //导出模板
  91. writeFile(workBook, `${judieFilename}.xlsx`, {
  92. bookType: "xlsx"
  93. });
  94. }
  95. const _loading = ref(false);
  96. async function handleExportPage() {
  97. const params = pageContentRef.value.getBasicParams();
  98. if (!params.start || !params.end) {
  99. ElMessage.warning('请选择导出的时间区间')
  100. return
  101. }
  102. const start = dayjs(params.start);
  103. const end = dayjs(params.end);
  104. const diffDay = start.diff(end, 'days')
  105. const startDays = start.daysInMonth();
  106. const endDays = end.daysInMonth();
  107. if (Math.abs(diffDay) > (startDays + endDays)) {
  108. ElMessage.warning('导出的时间区间不能超过两个月')
  109. return
  110. }
  111. await httpRequsetExport({
  112. url: "/admin/good/export",
  113. name: "咨询成交类目",
  114. onStart: () => (_loading.value = true),
  115. onSuccess: () => (_loading.value = false),
  116. onFail: () => (_loading.value = false),
  117. params: { isZx: 1, ...params, companyNo: currentCompany.value.companyNo, isChild: 0 },
  118. admin: false
  119. });
  120. }
  121. </script>
  122. <template>
  123. <div class="main role">
  124. <PagePower :is-show="hasPermissionWithCode('001')">
  125. <div w-full>
  126. <PageSearch :form-config="searchFormConfig" @search-btn-click="handleSearchClick"
  127. @reset-btn-click="handleResetClick" />
  128. <PageContent ref="pageContentRef" :powers="permissions" :content-config="contentConfig"
  129. @preview-btn-click="({ spuCode }) => toDetail(spuCode)" @selection-change="nodes => (selects = nodes)">
  130. <template #header>
  131. <ElButton size="small" v-if="hasPermissionWithCode('041')" :icon="useRenderIcon('arrow-down-line')"
  132. @click="() => onDownloadTemplate(true)">下载采购设置类目模板</ElButton>
  133. <ElButton size="small" type="primary" v-if="hasPermissionWithCode('042') && !isSuperUser"
  134. :icon="useRenderIcon('arrow-up-line')" @click="() => procureUploadModalRef.onDisplay()">批量导入采购设置类目结果
  135. </ElButton>
  136. <ElButton size="small" v-if="hasPermissionWithCode('036')" :icon="useRenderIcon('arrow-down-line')"
  137. @click="() => onDownloadTemplate()">下载财务设置类目模板</ElButton>
  138. <ElButton size="small" type="primary" :icon="useRenderIcon('arrow-up-line') "
  139. v-if="hasPermissionWithCode('037') && !isSuperUser" @click="() => execlUploadModalRef.onDisplay()">
  140. 批量导入财务设置类目结果</ElButton>
  141. <ElButton type="primary" @click="handleExportPage" size="small" v-if="hasPermissionWithCode('048')"
  142. :loading="_loading">导出
  143. </ElButton>
  144. </template>
  145. </PageContent>
  146. <ExeclUploadModal ref="execlUploadModalRef" @on-success="() => pageContentRef.onSearch()" />
  147. <ProcureImport ref="procureUploadModalRef" @on-success="() => pageContentRef.onSearch()" />
  148. </div>
  149. </PagePower>
  150. </div>
  151. </template>
  152. <style scoped lang="scss">
  153. :deep(.el-dropdown-menu__item i) {
  154. margin: 0;
  155. }
  156. </style>