index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import { ElButton, ElDialog, ElMessage } from "element-plus";
  4. import { execlUpload } from "/@/components/execlUpload";
  5. import { useResponseHandle } from "/@/hooks";
  6. import { useVModel } from "@vueuse/core";
  7. import { mapLabelToSource, mapLabelToType } from "../../config/shared";
  8. import { httpAdd } from "/@/api/invoiceInOut/inOutManager";
  9. import { columns, mapLabelToProp } from "./columns-config";
  10. import { mapLabelToInvtype } from "/@/utils/status";
  11. import { isImportDataValid } from "./validator";
  12. const loading = ref(false);
  13. const tableData = ref([]);
  14. const emit = defineEmits(["refresh"]);
  15. const props = defineProps<{ visible: boolean }>()
  16. const visible = useVModel(props, 'visible')
  17. const responseHandle = useResponseHandle();
  18. const Uploadsuccess = ({ results, header }) => {
  19. loading.value = true;
  20. if (results.length === 0) {
  21. ElMessage.error("表格无有效数据!");
  22. loading.value = false;
  23. return;
  24. }
  25. let headok = true;
  26. if (header.length !== columns.length - 1) {
  27. headok = false;
  28. } else {
  29. columns.slice(1).forEach((si, sii) => {
  30. if (si.label.trim() !== header[sii].trim()) {
  31. headok = false;
  32. }
  33. });
  34. }
  35. if (!headok) {
  36. ElMessage.error("表头与导入模板不匹配!");
  37. loading.value = false;
  38. return;
  39. }
  40. tableData.value = [];
  41. const result = []
  42. for(const tableItem of results){
  43. const item = {}
  44. Object.keys(tableItem).forEach(label => {
  45. const prop = mapLabelToProp[label]
  46. let value = tableItem[label]
  47. if (label === '发票类型') {
  48. value = value.replace('(', '(')
  49. value = value.replace(')', ')')
  50. }
  51. item[prop] = value
  52. // const labels = ['税率', '销售方公司纳税号', '购买方纳税号', '单位']
  53. // if (labels.includes(label.replace('_1', ''))) {
  54. // if ((prop || "").includes('inv_')) {
  55. // item[prop.replace('inv_', '')] = value
  56. // } else {
  57. // const prop = mapLabelToProp[label.replace('_1', '')]
  58. // item[prop] = value
  59. // }
  60. // } else {
  61. // }
  62. })
  63. result.push(item)
  64. }
  65. if(isImportDataValid(result)){ tableData.value = result }
  66. loading.value = false;
  67. };
  68. //提交
  69. const handleSubmit = async () => {
  70. try {
  71. if (loading.value) return;
  72. loading.value = true;
  73. const list = [];
  74. tableData.value.forEach(item => {
  75. list.push({
  76. ...item,
  77. inv_type: mapLabelToInvtype[item.inv_type],
  78. source: mapLabelToSource[item.source],
  79. type: mapLabelToType[item.type],
  80. inv_num: Number(item.inv_num).toFixed(8),
  81. inv_subprice: Number(item.inv_subprice).toFixed(8),
  82. inv_subtotal: Number(item.inv_subtotal).toFixed(8),
  83. inv_price: Number(item.inv_price).toFixed(8),
  84. inv_total: Number(item.inv_tax_total).toFixed(8),
  85. platform_type: "1",
  86. goodType: "1",
  87. channel: "2",
  88. relaArr: [{
  89. id: item.relaGoodNo,
  90. num: item.relaGoodNum
  91. }]
  92. })
  93. })
  94. // console.log(list)
  95. // return
  96. const { code, message,data: _d } = await httpAdd({ list });
  97. loading.value = false;
  98. responseHandle({
  99. code,
  100. message,
  101. noMessage: false,
  102. handler: () => {
  103. ElMessage.success("数据导入成功!");
  104. emit("refresh");
  105. visible.value = false;
  106. }
  107. });
  108. } catch (err) {
  109. console.log(err)
  110. }
  111. };
  112. const cancel = () => {
  113. tableData.value = [];
  114. };
  115. </script>
  116. <template>
  117. <ElDialog
  118. v-model="visible"
  119. :close-on-click-modal="false"
  120. title="非订单商品导入"
  121. width="1040px"
  122. top="8vh"
  123. center
  124. @close="tableData = []"
  125. >
  126. <execlUpload style="margin-bottom: 10px" @on-success="Uploadsuccess" v-if="tableData.length === 0" />
  127. <el-table
  128. :data="tableData"
  129. stripe
  130. border
  131. max-height="500px"
  132. size="small"
  133. style="width: 100%"
  134. >
  135. <el-table-column
  136. v-for="(si, sii) in columns"
  137. :minWidth="si.minWidth"
  138. show-overflow-tooltip
  139. :fixed="si.fixed"
  140. :prop="si.prop"
  141. :type="si.type"
  142. :key="sii"
  143. >
  144. <template #header>
  145. <span v-if="!si.required">
  146. {{ si.label }}
  147. </span>
  148. <p v-else>
  149. <span style="color: #f56c6c; font-size: 14px">* </span>
  150. {{ si.label }}
  151. </p>
  152. </template>
  153. </el-table-column>
  154. </el-table>
  155. <div
  156. flex
  157. justify-end
  158. gap-2
  159. v-if="tableData.length !== 0"
  160. style="padding: 10px 0 0 0"
  161. >
  162. <ElButton size="small" @click="cancel">取消</ElButton>
  163. <el-button
  164. size="small"
  165. type="primary"
  166. :loading="loading"
  167. @click="handleSubmit"
  168. >保存</el-button
  169. >
  170. </div>
  171. </ElDialog>
  172. </template>
  173. <style lang="scss" scoped></style>