From 37cdce5348ba4f3ee260cd8d433435cf0e795366 Mon Sep 17 00:00:00 2001
From: wujianwei <wjw@11.com>
Date: 星期一, 19 一月 2026 16:33:17 +0800
Subject: [PATCH] 新增前后端

---
 ui/admin-ui3/src/views/cwgl/invoiceManage/index.vue |  497 ++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 346 insertions(+), 151 deletions(-)

diff --git a/ui/admin-ui3/src/views/cwgl/invoiceManage/index.vue b/ui/admin-ui3/src/views/cwgl/invoiceManage/index.vue
index 49c4ed7..fe00b2a 100644
--- a/ui/admin-ui3/src/views/cwgl/invoiceManage/index.vue
+++ b/ui/admin-ui3/src/views/cwgl/invoiceManage/index.vue
@@ -1,175 +1,370 @@
 <template>
-  <basicContainer >
-    <avue-crud
-        :option="option"
-        :table-loading="pageF.loading"
-        :data="tableData"
-        :page="page"
-        :permission="permissionList"
-        :before-open="beforeOpen"
-        v-model="form"
-        ref="crudRef"
-        @row-update="rowUpdate"
-        @row-save="rowSave"
-        @refresh-change="refreshChange"
-        @row-del="rowDel"
-        @search-change="searchChange"
-        @search-reset="searchReset"
-        @selection-change="selectionChange"
-        @current-change="currentChange"
-        @size-change="sizeChange"
-        @on-load="onLoad"
-    >
+  <basicContainer>
+    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
+      :permission="permissionList" :before-open="beforeOpen" v-model="form" ref="crudRef" @row-update="rowUpdate"
+      @row-save="rowSave" @refresh-change="refreshChange" @row-del="rowDel" @search-change="searchChange"
+      @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
+      @size-change="sizeChange" @on-load="onLoad">
       <template #menu-left>
-        <el-button
-            type="success"
-            icon="Edit"
-            :disabled="pageF.single"
-            v-hasPermi="['cwgl:invoiceManage:edit']"
-            @click="handleUpdate">淇敼
+        <el-button type="primary" icon="Plus" v-hasPermi="['cwgl:invoiceManage:add']" @click="handleAdd">鏂板
         </el-button>
-        <el-button
-            type="danger"
-            icon="Delete"
-            :disabled="pageF.multiple"
-            @click="handleDelete"
-            v-hasPermi="['cwgl:invoiceManage:remove']"
-        >鍒犻櫎
+        <!-- <el-button type="success" icon="Edit" :disabled="pageF.single" v-hasPermi="['cwgl:invoiceManage:edit']"
+          @click="handleUpdate">淇敼1
+        </el-button> -->
+        <el-button type="danger" icon="Delete" :disabled="pageF.multiple" @click="handleDelete"
+          v-hasPermi="['cwgl:invoiceManage:remove']">鍒犻櫎
         </el-button>
-        <el-button
-            type="warning"
-            plain
-            icon="Download"
-            @click="handleExport"
-            v-hasPermi="['cwgl:invoiceManage:export']"
-        >瀵煎嚭
+        <el-button type="warning" plain icon="Download" @click="handleExport"
+          v-hasPermi="['cwgl:invoiceManage:export']">瀵煎嚭
         </el-button>
+      </template>
+      <template #menu="{ size, row, index }">
+        <el-link class="link-btn"  v-if="[0,3].includes(row.status)" type="primary" icon="Edit" :underline="false" plain :size="size"
+          @click="handleFy(row)" v-hasPermi="['cwgl:invoiceManage:edit']"> 淇敼
+        </el-link>
+         <el-link class="link-btn"  v-if="[1,2].includes(row.status)" type="primary" icon="Edit" :underline="false" plain :size="size"
+          @click="lookOver(row)" v-hasPermi="['cwgl:invoiceManage:edit']"> 鏌ョ湅
+        </el-link>
+           <el-link class="link-btn" v-if="[0,3].includes(row.status)" type="primary" icon="Position" :underline="false" plain :size="size"
+          @click="makeInvoice(row)" v-hasPermi="['cwgl:invoiceManage:apply']"> 鐢宠寮�绁�
+        </el-link>
+        <el-button type="text" icon="View" @click="handleFlow(row)"
+          v-hasPermi="['cwgl:invoiceManage:flow']">鏃ュ織</el-button>
+            <el-button type="text" v-if="[1,2].includes(row.status)" icon="Position" @click="linkedBills(row)"
+          v-hasPermi="['cwgl:invoiceManage:flow']">鍏宠仈璐﹀崟</el-button>
+        <el-link  type="primary" v-if="[0,3].includes(row.status)" icon="Delete"  @click="deleteRow(row)"
+          v-hasPermi="['cwgl:invoiceManage:remove']">鍒犻櫎
+        </el-link>
+            <!-- <el-link  type="primary" v-if="[2].includes(row.status)"   @click="download_qr_code(row)"
+          v-hasPermi="['cwgl:invoiceManage:remove']">涓嬭浇鍙戠エ
+        </el-link> -->
+
+
       </template>
     </avue-crud>
   </basicContainer>
+  <OperationLogModal ref="logModalRef" />
+  <InvoiceFormDialog ref="invoiceDialogRef" :title="titleInvoice" @submit="handleFinalSubmit" />
 </template>
 
 <script setup name="invoiceManage" lang="ts">
-  import {InvoiceManageI,addInvoiceManage, delInvoiceManage, exportInvoiceManage, getInvoiceManage, listInvoiceManage, updateInvoiceManage} from "@/api/cwgl/invoiceManage";
-  import useCurrentInstance from "@/utils/useCurrentInstance";
-  import {computed,reactive, ref, toRefs} from "vue";
-  import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
-  import {usePagePlus} from "@/hooks/usePagePlus";
-  import {hasPermission} from "@/utils/permissionUtils";
+import { InvoiceManageI, addInvoiceManage, delInvoiceManage, exportInvoiceManage, getInvoiceManage, listInvoiceManage, updateInvoiceManage,
+  cwglInvoiceManageApply
+ } from "@/api/cwgl/invoiceManage";
+import useCurrentInstance from "@/utils/useCurrentInstance";
+import { computed, reactive, ref, toRefs,onUnmounted } from "vue";
+import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
+import { usePagePlus } from "@/hooks/usePagePlus";
+import { hasPermission } from "@/utils/permissionUtils";
+import InvoiceFormDialog from '@/components/InvoiceFormDialog/index'
+import OperationLogModal from '@/components/OperationLogModal/index.vue';
+  import { listInvoiceManageLog} from "@/api/cwgl/invoiceManageLog";
+import { getToken } from "@/utils/auth";
 
-  const { proxy } = useCurrentInstance();
-  const crudRef = ref();
+const { proxy } = useCurrentInstance();
+const crudRef = ref();
 
-  const permissionList = computed(()=>{
-    return {
-      addBtn: hasPermission(["cwgl:invoiceManage:add"]),
-      delBtn: hasPermission(["cwgl:invoiceManage:remove"]),
-      editBtn: hasPermission(["cwgl:invoiceManage:edit"]),
-      viewBtn: hasPermission(["cwgl:invoiceManage:query"]),
-    }
-  })
+const permissionList = computed(() => {
+  return {
+    addBtn: hasPermission(["cwgl:invoiceManage:add"]),
+    delBtn: hasPermission(["cwgl:invoiceManage:remove"]),
+    editBtn: hasPermission(["cwgl:invoiceManage:edit"]),
+    viewBtn: hasPermission(["cwgl:invoiceManage:query"]),
+  }
+})
 
-  const data = reactive({
-    form:<InvoiceManageI>{},
-    queryParams:<InvoiceManageI&PageQueryInterface>{},
-    page: <PagesInterface>{
-      pageSize: 10,
-      total: 0,
-      currentPage: 1,
+const data = reactive({
+  form: <InvoiceManageI>{},
+  queryParams: <InvoiceManageI & PageQueryInterface>{},
+  page: <PagesInterface>{
+    pageSize: 10,
+    total: 0,
+    currentPage: 1,
+  },
+  selectionList: [],
+  titleInvoice: ''
+
+})
+const { queryParams, form, page, selectionList, titleInvoice } = toRefs(data);
+const option = ref({
+  pageKey: 'InvoiceManage',
+  rowKey: 'id',
+  searchSpan: 5,
+  labelWidth: 180,
+  searchLabelWidth: 150,
+  addBtn: false,
+  viewBtn: false,
+  editBtn: false,
+   delBtn: false,
+  column: {
+    // id: {
+    //   label: '涓诲缓',
+    // },
+    // invoiceInfoId: {
+    //   label: '鍙戠エ鎶ごid',
+    // },
+    // invoiceSellerId: {
+    //   label: '鍙戠エ閿�鍞柟id',
+    // },
+    invoiceNo: {
+      label: '鍙戠エ鍙风爜',
+      search: true,
+
     },
-    selectionList:[],
-  })
-  const {queryParams,form,page,selectionList} = toRefs(data);
-  const option = ref({
-    pageKey: 'InvoiceManage',
-    rowKey: 'id',
-    column: {
-                                id: {
-          label: '涓诲缓',
-                            },
-                                invoiceInfoId: {
-          label: '鍙戠エ鎶ごid',
-                            },
-                                invoiceSellerId: {
-          label: '鍙戠エ閿�鍞柟id',
-                            },
-                                customerName: {
-          label: '瀹㈡埛鍚嶇О',
-                            },
-                                invoiceSellerName: {
-          label: '鍙戠エ閿�鍞柟鍚嶇О',
-                            },
-                                invoiceCompanyName: {
-          label: '鎶ご鍏徃',
-                            },
-                                invoiceCreditCode: {
-          label: '缁熶竴绀句細淇$敤浠g爜',
-                            },
-                                invoiceSellerCreditCode: {
-          label: '閿�鍞柟缁熶竴绀句細淇$敤浠g爜',
-                            },
-                                invoiceBankName: {
-          label: '寮�鎴烽摱琛屽悕绉�',
-                            },
-                                invoiceBankNo: {
-          label: '鍩烘湰寮�鎴疯处鍙�',
-                            },
-                                invoiceOperatingLicenseAddress: {
-          label: '娉ㄥ唽鍦烘墍鍦板潃',
-                            },
-                                invoiceOperatingLicensePhone: {
-          label: '娉ㄥ唽鍥哄畾鐢佃瘽',
-                            },
-                                invoiceOperatingLicenseEmail: {
-          label: '閭',
-                            },
-                                status: {
-          label: '鐘舵��',
-                            },
-                                createBy: {
-          label: '鍒涘缓浜�',
-                            },
-                                updateBy: {
-          label: '鏇存柊浜�',
-                            },
-                                createTime: {
-          label: '鍒涘缓鏃堕棿',
-                            },
-                                updateTime: {
-          label: '鏇存柊鏃堕棿',
-                            },
-                                deleted: {
-          label: '鍒犻櫎',
-                            },
-                                invoiceType: {
-          label: '鍙戠エ绫诲瀷',
-                            },
-                                enterpriseType: {
-          label: '浼佷笟绫诲瀷',
-                            },
-          }
-  })
+    invoiceDate: {
+      label: '寮�绁ㄦ椂闂�',
+    },
+    invoiceDateArray: {
+      label: '寮�绁ㄦ椂闂�',
+      search: true,
+      searchRange: true,
+      type: 'daterange',
+      startPlaceholder: '寮�濮嬫棩鏈�',
+      endPlaceholder: '缁撴潫鏃ユ湡',
+      valueFormat: 'YYYY-MM-DD',
+      hide: true,
+      addDisplay: false,
+      editDisplay: false,
+    },
+    invoiceAmount: {
+      label: '鍙戠エ閲戦',
+    },
+    invoiceCompanyName: {
+      label: '璐拱鏂瑰悕绉�',
+      search: true,
 
-  const { tableData,pageF,rowSave,rowUpdate,rowDel,beforeOpen,searchChange,
-    searchReset,selectionChange,onLoad,currentChange,sizeChange,handleDelete,handleExport,handleUpdate,refreshChange} = usePagePlus({
-    form:form,
-    option:option,
-    queryParams:queryParams,
-    idKey:'id',
-    page:page.value,
-    getListApi:listInvoiceManage,
-    getDetailApi:getInvoiceManage,
-    exportApi:exportInvoiceManage,
-    deleteApi:delInvoiceManage,
-    addApi:addInvoiceManage,
-    updateApi:updateInvoiceManage,
-    handleUpdateFunc:()=>{
+    },
+    invoiceSellerName: {
+      label: '閿�鍞柟鍚嶇О',
+      search: true,
+
+    },
+
+    // customerName: {
+    //   label: '瀹㈡埛鍚嶇О',
+    // },
+
+    // invoiceSellerName: {
+    //   label: '鍙戠エ閿�鍞柟鍚嶇О',
+    // },
+    // invoiceCompanyName: {
+    //   label: '鎶ご鍏徃',
+    // },
+    // invoiceCreditCode: {
+    //   label: '缁熶竴绀句細淇$敤浠g爜',
+    // },
+    // invoiceSellerCreditCode: {
+    //   label: '閿�鍞柟缁熶竴绀句細淇$敤浠g爜',
+    // },
+    // invoiceBankName: {
+    //   label: '寮�鎴烽摱琛屽悕绉�',
+    // },
+    // invoiceBankNo: {
+    //   label: '鍩烘湰寮�鎴疯处鍙�',
+    // },
+    // invoiceOperatingLicenseAddress: {
+    //   label: '娉ㄥ唽鍦烘墍鍦板潃',
+    // },
+    // invoiceOperatingLicensePhone: {
+    //   label: '娉ㄥ唽鍥哄畾鐢佃瘽',
+    // },
+    // invoiceOperatingLicenseEmail: {
+    //   label: '閭',
+    // },
+    status: {
+      label: '鐘舵��',
+      search: true,
+      minWidth: 120,
+      dataType: 'string',
+      type: 'select',
+
+      dicUrl: '/system/dict/data/type/sys_make_invoice',
+      //    formatter: (row, value) => {
+      // // 鑷畾涔夋牸寮忓寲閫昏緫锛堝鏋滈渶瑕侊級
+      //   return value;
+      //  }
+    },
+    // createBy: {
+    //   label: '鍒涘缓浜�',
+    // },
+    // updateBy: {
+    //   label: '鏇存柊浜�',
+    // },
+    // createTime: {
+    //   label: '鍒涘缓鏃堕棿',
+    // },
+    // updateTime: {
+    //   label: '鏇存柊鏃堕棿',
+    // },
+    // invoiceType: {
+    //   label: '鍙戠エ绫诲瀷',
+    // },
+    // enterpriseType: {
+    //   label: '浼佷笟绫诲瀷',
+    // },
+  }
+})
+
+const { tableData, pageF, rowSave, rowUpdate, rowDel, beforeOpen, searchChange,
+  searchReset, selectionChange, onLoad, currentChange, sizeChange, handleDelete, handleExport, handleUpdate, refreshChange } = usePagePlus({
+    form: form,
+    option: option,
+    queryParams: queryParams,
+    idKey: 'id',
+    page: page.value,
+    getListApi: listInvoiceManage,
+    getDetailApi: getInvoiceManage,
+    exportApi: exportInvoiceManage,
+    deleteApi: delInvoiceManage,
+    addApi: addInvoiceManage,
+    updateApi: updateInvoiceManage,
+    handleUpdateFunc: () => {
       crudRef.value.rowEdit(selectionList.value[0]);
     },
-    handleSelectionChangeFunc:(selection:any)=>{
+    handleSelectionChangeFunc: (selection: any) => {
       selectionList.value = selection;
+    },
+    getBeginListFunc: (params = {}) => {
+      let newParams = { ...params };
+      newParams = proxy.addDateRangeNew(newParams, newParams?.invoiceDateArray, 'invoiceDate') || [];
+      delete newParams.invoiceDateArray;
+      queryParams.value = newParams;
+
+      return newParams
     }
   })
 
 
+const invoiceDialogRef = ref(null)
+
+const handleAdd = () => {
+  // 涔熷彲浠ヤ紶鍏ュ垵濮嬫暟鎹�
+  titleInvoice.value = '鏂板鍙戠エ'
+  invoiceDialogRef.value.open()
+}
+
+const handleFinalSubmit = (data) => {
+  console.log('鏈�缁堟彁浜ょ粰API鐨勬暟鎹�:', data)
+  if(titleInvoice.value === '鏂板鍙戠エ'){
+
+    addInvoiceManage(data).then((res) => {
+      if (res.code === 200) {
+        proxy.$message.success('娣诲姞鎴愬姛');
+        invoiceDialogRef.value.handleClose()
+        onLoad(page.value);
+      }
+    })
+  }else if(titleInvoice.value === '淇敼鍙戠エ'){
+    updateInvoiceManage(data).then((res) => {
+      if (res.code === 200) {
+        proxy.$message.success('淇敼鎴愬姛');
+        invoiceDialogRef.value.handleClose()
+        onLoad(page.value);
+      }
+    })
+  }else if(titleInvoice.value === '鍏宠仈璐﹀崟'){
+    updateInvoiceManage(data).then((res) => {
+      if (res.code === 200) {
+        proxy.$message.success('鍏宠仈鎴愬姛');
+        invoiceDialogRef.value.handleClose()
+        onLoad(page.value);
+      }
+    })
+  }
+}
+const handleFy = (row) => {
+  getInvoiceManage(row.id).then((res) => {
+    if (res.code === 200) {
+      titleInvoice.value = '淇敼鍙戠エ'
+      invoiceDialogRef.value.open(res.data)
+      
+    }
+  })
+
+}
+const makeInvoice = (row) => {
+    proxy.$modal.confirm('鏄惁纭鐢宠寮�绁ㄥ彿鐮佷负"' + row.invoiceNo + '"?').then(function() {
+    return cwglInvoiceManageApply(row.id);
+  }).then(() => {
+    onLoad(page.value);
+    proxy.$modal.msgSuccess("鐢宠寮�绁ㄦ垚鍔�");
+  }).catch(() => {});
+}
+const deleteRow = (row) => {
+    proxy.$modal.confirm('鏄惁纭鍒犻櫎鍙戠エ鍙风爜涓�"' + row.invoiceNo + '"鐨勮褰�?').then(function() {
+    return delInvoiceManage(row.id);
+  }).then(() => {
+    onLoad(page.value);
+    proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+}
+/* 鏃ュ織 */
+const logModalRef = ref(null);
+const handleFlow = (row: any) => {
+  listInvoiceManageLog({ invoiceManageId: row.id }).then((res) => {
+    if (res.code == 200) {
+      logModalRef.value.open(res.rows, 'receivable');
+
+    }
+  });
+}
+/* 鍏宠仈璐﹀崟 */
+const linkedBills = (row) => {
+    getInvoiceManage(row.id).then((res) => {
+    if (res.code === 200) {
+      titleInvoice.value = '鍏宠仈璐﹀崟'
+      invoiceDialogRef.value.open(res.data)
+      
+    }
+  })
+}
+const lookOver = (row) => {
+  getInvoiceManage(row.id).then((res) => {
+    if (res.code === 200) {
+      titleInvoice.value = '鏌ョ湅鍏宠仈璐﹀崟'
+      invoiceDialogRef.value.open(res.data)
+      
+    }
+  })
+
+}
+
+
+const download_qr_code = (row: any) => {
+  // window.location.href = baseURL + "/common/download/resource?resource=" + encodeURI(row.url);
+  downloadFile(row.url);
+}
+const baseURL = import.meta.env.VITE_APP_BASE_API
+// 鍒涘缓涓�涓偣鍑讳簨浠惰Е鍙戜笅杞�
+function downloadFile(row: any) {
+  // 鏂囦欢涓嬭浇鍦板潃
+  const fileUrl = baseURL + "/common/download/resource?resource=" + encodeURI(row);
+  // 璁剧疆璇锋眰澶�
+  const headers = new Headers();
+  headers.append('Authorization', 'Bearer ' + getToken()); // 璁剧疆鎺堟潈澶达紝鏇挎崲YourAccessToken涓哄疄闄呯殑璁块棶浠ょ墝
+  // 鍙戣捣 Fetch 璇锋眰
+  fetch(fileUrl, {
+    method: 'GET',
+    headers: headers,
+  })
+    .then(response => response.blob())
+    .then(blob => {
+      // 鍒涘缓涓�涓櫄鎷熺殑閾炬帴鍏冪礌锛屾ā鎷熺偣鍑讳笅杞�
+      const link = document.createElement('a');
+      link.href = window.URL.createObjectURL(blob);
+      link.download = row; // 璁剧疆涓嬭浇鏂囦欢鍚嶏紝鏇挎崲filename.ext涓哄疄闄呯殑鏂囦欢鍚嶅拰鎵╁睍鍚�
+      document.body.appendChild(link);
+      // 妯℃嫙鐐瑰嚮
+      link.click();
+
+      // 绉婚櫎铏氭嫙閾炬帴鍏冪礌
+      document.body.removeChild(link);
+    })
+    .catch(error => console.error('涓嬭浇澶辫触锛�', error));
+}
+
+onUnmounted(() => {
+  // 鍦ㄧ粍浠跺嵏杞芥椂绉婚櫎浜嬩欢鐩戝惉鍣紝浠ラ伩鍏嶅唴瀛樻硠婕�
+  resizeObserver.disconnect();
+})
 </script>

--
Gitblit v1.8.0