|
@@ -0,0 +1,213 @@
|
|
|
+<script setup lang="ts">
|
|
|
+import { ref } from "vue";
|
|
|
+import { ElMessage } from "element-plus";
|
|
|
+import { execlUpload } from "/@/components/execlUpload";
|
|
|
+import { httpInvoiceBatch } from "/@/api/purchase/ticketReturn";
|
|
|
+import { useResponseHandle } from "/@/hooks";
|
|
|
+import { useCompany } from "/@/hooks/core/useCompany";
|
|
|
+
|
|
|
+import { division } from "/@/utils/calc";
|
|
|
+
|
|
|
+
|
|
|
+import {
|
|
|
+ initheaders,
|
|
|
+ columns,
|
|
|
+ mapProp,
|
|
|
+ requireHeaders
|
|
|
+} from "./columns-config";
|
|
|
+
|
|
|
+const visible = ref(false);
|
|
|
+const loading = ref(false);
|
|
|
+const tableData = ref([]);
|
|
|
+const columnsConfig = columns();
|
|
|
+const emit = defineEmits(["onSuccess"]);
|
|
|
+
|
|
|
+const { currentCompany } = useCompany();
|
|
|
+
|
|
|
+const responseHandle = useResponseHandle();
|
|
|
+
|
|
|
+function validate(data: any[]){
|
|
|
+ let hasError = false
|
|
|
+ const requiredErrors = []
|
|
|
+ data.forEach((item,index) => {
|
|
|
+ const keys = Object.keys(item)
|
|
|
+ keys.forEach(key => {
|
|
|
+ if(requireHeaders.includes(key)){
|
|
|
+ const value = item[key]
|
|
|
+ if((!value || String(value).trim() === '' ) && !requiredErrors.includes(index + 1)) {
|
|
|
+ hasError = true
|
|
|
+ requiredErrors.push(index + 1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ if(hasError){ ElMessage.error('第 ' + requiredErrors.join(',') + ' 行' + '发票明细ID,订单编号,本次开票金额,本次开票数量不能为空') }
|
|
|
+ return hasError
|
|
|
+}
|
|
|
+
|
|
|
+const Uploadsuccess = ({ results, header }) => {
|
|
|
+ loading.value = true;
|
|
|
+ if (results.length === 0) {
|
|
|
+ ElMessage.error("表格无有效数据!");
|
|
|
+ loading.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ let headok = true;
|
|
|
+ if (header.length !== initheaders.length) {
|
|
|
+ headok = false;
|
|
|
+ } else {
|
|
|
+ initheaders.forEach((si, sii) => {
|
|
|
+ if (si !== header[sii]) {
|
|
|
+ console.log(si, header[sii])
|
|
|
+ headok = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (!headok) {
|
|
|
+ ElMessage.error("表头与导入模板不匹配!");
|
|
|
+ loading.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ tableData.value = [];
|
|
|
+ try {
|
|
|
+ for (const v1 of results) {
|
|
|
+ const b = Object.values(v1);
|
|
|
+ let model = {};
|
|
|
+ b.forEach((si, sii) => {
|
|
|
+ model["value" + sii] = si + "";
|
|
|
+ });
|
|
|
+ tableData.value.push(model);
|
|
|
+ }
|
|
|
+ loading.value = false;
|
|
|
+ } catch (err) {
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+ const data = []
|
|
|
+ tableData.value.forEach((key, index) => {
|
|
|
+ const obj: Record<string, string> = {};
|
|
|
+ for (let i in key) {
|
|
|
+ const prop = mapProp[i];
|
|
|
+ const value = key[i];
|
|
|
+ obj[prop] = value;
|
|
|
+ }
|
|
|
+ data.push(obj);
|
|
|
+ });
|
|
|
+ const isValid = validate(data)
|
|
|
+ if(isValid){
|
|
|
+ tableData.value = []
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+//提交
|
|
|
+const handleSubmit = async () => {
|
|
|
+ if (loading.value) return;
|
|
|
+ let list = []
|
|
|
+
|
|
|
+ const data = [];
|
|
|
+
|
|
|
+ tableData.value.forEach((key, index) => {
|
|
|
+ const obj: Record<string, string> = {};
|
|
|
+ for (let i in key) {
|
|
|
+ const prop = mapProp[i];
|
|
|
+ const value = key[i];
|
|
|
+ obj[prop] = value;
|
|
|
+ }
|
|
|
+ data.push(obj);
|
|
|
+ });
|
|
|
+
|
|
|
+ data.forEach(item => {
|
|
|
+ const { itemId, code, num, total_amount } = item
|
|
|
+ const good_price = Number(division(total_amount, num)).toFixed(2)
|
|
|
+ list.push({ itemId, code, num, good_price , total_amount, remark: '' })
|
|
|
+ });
|
|
|
+
|
|
|
+ const { code, message } = await httpInvoiceBatch({ order_type: '1', list });
|
|
|
+
|
|
|
+ responseHandle({
|
|
|
+ code,
|
|
|
+ message,
|
|
|
+ handler: () => {
|
|
|
+ ElMessage.success("数据导入成功!");
|
|
|
+ emit("onSuccess");
|
|
|
+ visible.value = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+};
|
|
|
+const cancel = () => {
|
|
|
+ tableData.value = [];
|
|
|
+};
|
|
|
+defineExpose({
|
|
|
+ onDisplay: () => ((visible.value = true), (tableData.value = []))
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <el-dialog
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ v-model="visible"
|
|
|
+ title="批量导入发票与订单关联结果"
|
|
|
+ width="1040px"
|
|
|
+ top="8vh"
|
|
|
+ center
|
|
|
+ >
|
|
|
+ <execlUpload @on-success="Uploadsuccess" v-if="tableData.length === 0" />
|
|
|
+
|
|
|
+ <el-table
|
|
|
+ :data="tableData"
|
|
|
+ stripe
|
|
|
+ border
|
|
|
+ max-height="500px"
|
|
|
+ size="small"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-table-column
|
|
|
+ v-for="(si, sii) in columnsConfig"
|
|
|
+ :type="si.type"
|
|
|
+ :minWidth="si.minWidth"
|
|
|
+ :fixed="si.fixed"
|
|
|
+ :key="sii"
|
|
|
+ :prop="si.prop"
|
|
|
+ show-overflow-tooltip
|
|
|
+ >
|
|
|
+ <template #header>
|
|
|
+ <span
|
|
|
+ v-if="
|
|
|
+ !requireHeaders.includes(mapProp[si.prop]) || si.label === '序号'
|
|
|
+ "
|
|
|
+ >{{ si.label }}</span
|
|
|
+ >
|
|
|
+ <p v-else>
|
|
|
+ <span style="color: #f56c6c; font-size: 14px">* </span>
|
|
|
+ {{ si.label }}
|
|
|
+ </p>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <div
|
|
|
+ flex
|
|
|
+ justify-end
|
|
|
+ gap-2
|
|
|
+ v-if="tableData.length !== 0"
|
|
|
+ style="padding: 10px 0 0 0"
|
|
|
+ >
|
|
|
+ <el-button size="small" @click="cancel">取消</el-button>
|
|
|
+ <el-button
|
|
|
+ size="small"
|
|
|
+ type="primary"
|
|
|
+ :loading="loading"
|
|
|
+ @click="handleSubmit"
|
|
|
+ >保存</el-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+:deep(.el-upload-list__item) {
|
|
|
+ display: none !important;
|
|
|
+}
|
|
|
+</style>
|