From df1992a1c3ca982b1432aaf41668bb8437d02a2d Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期一, 11 八月 2025 17:52:11 +0800 Subject: [PATCH] 登录页联调开发,首页开发,销售台账开发,添加依赖 --- src/pages/index.vue | 707 +++++++++++++++++++++- src/api/salesManagement/invoiceLedger.js | 92 ++ src/pages.json | 14 src/pages/sales/salesAccount/index.vue | 392 ++++++++++++ pnpm-lock.yaml | 60 + src/pages/login.vue | 5 src/api/salesManagement/salesLedger.js | 111 +++ src/pages/sales/salesAccount/detail.vue | 279 +++++++++ src/main.js | 3 package.json | 1 src/api/salesManagement/invoiceRegistration.js | 54 + src/App.vue | 2 src/api/salesManagement/receiptPayment.js | 84 ++ 13 files changed, 1,730 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index 4941835..c976fd4 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "pinia": "2.2.2", "tslib": "^2.7.0", "uview-plus": "^3.4.62", + "vant": "^4.9.21", "vue": "3.4.21", "vue-i18n": "^9.14.2" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc01d28..b41ce8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,8 +84,11 @@ specifier: ^2.7.0 version: 2.7.0 uview-plus: - specifier: ^3.3.32 - version: 3.3.36 + specifier: ^3.4.62 + version: 3.4.84 + vant: + specifier: ^4.9.21 + version: 4.9.21(vue@3.4.21(typescript@5.6.3)) vue: specifier: 3.4.21 version: 3.4.21(typescript@5.6.3) @@ -1313,35 +1316,30 @@ engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} @@ -1401,55 +1399,46 @@ resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} @@ -1520,6 +1509,14 @@ '@uview-plus/types@3.2.5': resolution: {integrity: sha512-Zblby3WEN5d+NqS/UGs+1W5T55rs5zJw5eGKLUYoU5lKFm1arrlobbjA9/U481q68gBb7xA2775KKfk0FU5nnA==} + + '@vant/popperjs@1.3.0': + resolution: {integrity: sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==} + + '@vant/use@1.6.0': + resolution: {integrity: sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==} + peerDependencies: + vue: ^3.0.0 '@vitejs/plugin-legacy@5.3.2': resolution: {integrity: sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==} @@ -1634,6 +1631,9 @@ '@vue/shared@3.5.12': resolution: {integrity: sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==} + + '@vue/shared@3.5.18': + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} '@vue/tsconfig@0.5.1': resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} @@ -3834,13 +3834,18 @@ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uview-plus@3.3.36: - resolution: {integrity: sha512-yiIIt3OkCDkBzflrr6by8qvYibvCzsFZ/Mn+Fdx9TDaTQAltWFBj7UNVN/wOeb3lou2T5S1QFy2rxw3OcAYi5g==} - engines: {HBuilderX: ^3.1.0} + uview-plus@3.4.84: + resolution: {integrity: sha512-JIDgO3sIj3XmmbOAK1GefJt2NZHqDTYO8We/aNcyAml3QYXAq8HRIOdO66Vg+fjLwAkeH65X1IgKkYzwxM2xKQ==} + engines: {HBuilderX: ^3.1.0, uni-app: ^4.66, uni-app-x: ''} v8-to-istanbul@8.1.1: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} + + vant@4.9.21: + resolution: {integrity: sha512-hXUoZMrLLjykimFRLDlGNd+K2iYSRh9YwLMKnsVdVZ+9inUKxpqnjhOqlZwocbnYkvJlS+febf9u9aJpDol4Pw==} + peerDependencies: + vue: ^3.0.0 vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} @@ -6225,6 +6230,12 @@ '@uview-plus/types@3.2.5': {} + '@vant/popperjs@1.3.0': {} + + '@vant/use@1.6.0(vue@3.4.21(typescript@5.6.3))': + dependencies: + vue: 3.4.21(typescript@5.6.3) + '@vitejs/plugin-legacy@5.3.2(terser@5.34.1)(vite@5.2.8(@types/node@22.7.5)(less@4.2.0)(sass@1.79.5)(terser@5.34.1))': dependencies: '@babel/core': 7.25.8 @@ -6412,6 +6423,8 @@ '@vue/shared@3.4.21': {} '@vue/shared@3.5.12': {} + + '@vue/shared@3.5.18': {} '@vue/tsconfig@0.5.1': {} @@ -8882,7 +8895,7 @@ utils-merge@1.0.1: {} - uview-plus@3.3.36: + uview-plus@3.4.84: dependencies: clipboard: 2.0.11 dayjs: 1.11.13 @@ -8893,6 +8906,13 @@ convert-source-map: 1.9.0 source-map: 0.7.4 + vant@4.9.21(vue@3.4.21(typescript@5.6.3)): + dependencies: + '@vant/popperjs': 1.3.0 + '@vant/use': 1.6.0(vue@3.4.21(typescript@5.6.3)) + '@vue/shared': 3.5.18 + vue: 3.4.21(typescript@5.6.3) + vary@1.1.2: {} vite@5.2.8(@types/node@22.7.5)(less@4.2.0)(sass@1.79.5)(terser@5.34.1): diff --git a/src/App.vue b/src/App.vue index fdd16e8..f664715 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,6 @@ <template> <Splash v-if="showSplash" /> - <div v-else> + <div v-else> <router-view /> </div> </template> diff --git a/src/api/salesManagement/invoiceLedger.js b/src/api/salesManagement/invoiceLedger.js new file mode 100644 index 0000000..6a54493 --- /dev/null +++ b/src/api/salesManagement/invoiceLedger.js @@ -0,0 +1,92 @@ +// 寮�绁ㄥ彴璐﹂〉闈㈡帴鍙� +import request from '@/utils/request' + +// 鍒嗛〉鏌ヨ +export function invoiceLedgerList(query) { + return request({ + url: '/invoiceLedger/page', + method: 'get', + params: query + }) +} + +// 鏂板 +export function invoiceLedgerSaveOrUpdate(query) { + return request({ + url: '/invoiceLedger/saveOrUpdate', + method: 'post', + data: query + }) +} + +// 寮�绁ㄥ彴璐﹀垹闄� +export function invoiceLedgerDel(query) { + return request({ + url: '/invoiceLedger/del', + method: 'delete', + data: query + }) +} + +// 璇︽儏鏌ヨ +export function invoiceLedgerDetail(query) { + return request({ + url: '/invoiceLedger/info', + method: 'get', + params: query + }) +} + +// 闄勪欢鎻愪氦 +export function commitFile(query) { + return request({ + url: '/invoiceLedger/commitFile', + method: 'post', + data: query + }) +} + +// 寮�绁ㄥ彴璐﹂儴鍒嗕篃鏌ヨ +export function invoiceLedgerListNoPage(query) { + return request({ + url: '/invoiceLedger/list', + method: 'get', + data: query + }) +} + +// 鍒嗛〉鏌ヨ +export function invoiceLedgerSalesAccount(query) { + return request({ + url: '/invoiceLedger/salesAccount', + method: 'get', + params: query + }) +} + +// 浜у搧寮�绁ㄨ褰曞垎椤垫煡璇� +export function registrationProductPage(query) { + return request({ + url: '/invoiceLedger/registrationProductPage', + method: 'get', + params: query + }) +} + +// 浜у搧寮�绁ㄨ鎯呮煡璇� +export function invoiceLedgerProductInfo(query) { + return request({ + url: '/invoiceLedger/invoiceLedgerProductInfo', + method: 'get', + params: query + }) +} + +export function delInvoiceLedgerByRegProductId(invoiceRegistrationProductId) { + return request({ + url: '/invoiceLedger/delInvoiceLedger/'+ invoiceRegistrationProductId, + method: 'delete' + }) +} + + diff --git a/src/api/salesManagement/invoiceRegistration.js b/src/api/salesManagement/invoiceRegistration.js new file mode 100644 index 0000000..4bc33ce --- /dev/null +++ b/src/api/salesManagement/invoiceRegistration.js @@ -0,0 +1,54 @@ +// 閿�鍞彴璐﹂〉闈㈡帴鍙� +import request from '@/utils/request' + +// 鍒嗛〉鏌ヨ +export function invoiceRegistrationList(query) { + return request({ + url: '/invoiceRegistration/listPage', + method: 'get', + params: query + }) +} +// 寮�绁ㄧ櫥璁版柊澧� +export function invoiceRegistrationSave(query) { + return request({ + url: '/invoiceRegistration/save', + method: 'post', + data: query + }) +} +// 寮�绁ㄧ櫥璁板垹闄� +export function invoiceRegistrationDel(query) { + return request({ + url: '/invoiceRegistration/del', + method: 'delete', + data: query + }) +} +// 瀛愯〃鏍兼煡璇� +export function productList(query) { + return request({ + url: '/invoiceRegistration/productList', + method: 'get', + params: query + }) +} + +// 寮�绁ㄧ櫥璁拌鎯� +export function invoiceRegistrationDetail(query) { + return request({ + url: '/invoiceRegistration/detail', + method: 'get', + params: query + }) +} + +// 瀵煎嚭寮�绁ㄧ櫥璁� +export function invoiceRegistrationExport(query) { + return request({ + url: '/invoiceRegistration/export', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/src/api/salesManagement/receiptPayment.js b/src/api/salesManagement/receiptPayment.js new file mode 100644 index 0000000..b5d0cf5 --- /dev/null +++ b/src/api/salesManagement/receiptPayment.js @@ -0,0 +1,84 @@ +// 寮�绁ㄧ櫥璁伴〉闈㈡帴鍙� +import request from '@/utils/request' + +// 鏂板/淇敼 +export function receiptPaymentSaveOrUpdate(query) { + return request({ + url: '/receiptPayment/saveOrUpdate', + method: 'post', + data: query + }) +} + +// 瀹㈡埛寰�鏉ヨ褰曟煡璇� +export function customerInteractions(query) { + return request({ + url: '/receiptPayment/customerInteractions', + method: 'get', + params: query + }) +} + +// 璇︽儏 +export function receiptPaymentInfo(query) { + return request({ + url: '/receiptPayment/info', + method: 'get', + params: query + }) +} + +// 鍒犻櫎 +export function receiptPaymentDel(query) { + return request({ + url: '/receiptPayment/del', + method: 'delete', + data: query + }) +} + +// 鏌ヨ宸茬粡缁戝畾鍙戠エ鐨勫紑绁ㄥ彴璐� +export function bindInvoiceNoRegPage(query) { + return request({ + url: '/receiptPayment/bindInvoiceNoRegPage', + method: 'get', + params: query + }) +} + +// 寮�绁ㄥ彴璐﹁鎯� +export function invoiceInfo(query) { + return request({ + url: '/receiptPayment/invoiceInfo', + method: 'get', + params: query + }) +} + +// 璇㈠洖娆捐褰� +export function receiptPaymentHistoryList(query) { + return request({ + url: '/receiptPayment/receiptPaymentHistoryList', + method: 'get', + params: query + }) +} + +/** + * 鏌ヨ鍥炴璁板綍鍒嗛〉鏌ヨ + */ +export function receiptPaymentHistoryListPage(query) { + return request({ + url: '/receiptPayment/receiptPaymentHistoryListPage', + method: 'get', + params: query + }) +} + +export function receiptPaymentHistoryListNoPage(query) { + return request({ + url: '/receiptPayment/receiptPaymentHistoryListNoPage', + method: 'get', + params: query + }) +} diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js new file mode 100644 index 0000000..3a2fa22 --- /dev/null +++ b/src/api/salesManagement/salesLedger.js @@ -0,0 +1,111 @@ +// 閿�鍞彴璐﹂〉闈㈡帴鍙� +import request from "@/utils/request"; + +// 鍒嗛〉鏌ヨ +export function ledgerList(query) { + return request({ + url: "/sales/ledger/list", + method: "get", + params: query, + }); +} +// 瀛愯〃鏍兼煡璇� +export function productList(query) { + return request({ + url: "/sales/product/list", + method: "get", + params: query, + }); +} +// 鏌ヨ瀹㈡埛鍚嶇О鍒楄〃 +export function customerList(query) { + return request({ + url: "/basic/customer/customerList", + method: "get", + params: query, + }); +} +// 鏂板銆佷慨鏀归攢鍞彴璐� +export function addOrUpdateSalesLedger(query) { + return request({ + url: "/sales/ledger/addOrUpdateSalesLedger", + method: "post", + data: query, + }); +} +// 鍒犻櫎閿�鍞彴璐� +export function delLedger(query) { + return request({ + url: "/sales/ledger/delLedger", + method: "delete", + data: query, + }); +} +// 鏌ヨ閿�鍞彴璐﹁鎯� +export function getSalesLedgerWithProducts(query) { + return request({ + url: "/sales/ledger/getSalesLedgerWithProducts", + method: "get", + params: query, + }); +} +// 瀹炴椂淇敼浜у搧淇℃伅 +export function addOrUpdateSalesLedgerProduct(query) { + return request({ + url: "/sales/product/addOrUpdateSalesLedgerProduct", + method: "post", + data: query, + }); +} +// 鍒犻櫎浜у搧 +export function delProduct(query) { + return request({ + url: "/sales/product/delProduct", + method: "delete", + data: query, + }); +} +// 涓婁紶闄勪欢 +export function upload(query) { + return request({ + url: "/file/upload", + method: "post", + data: query, + responseType: "blob", + }); +} +// 缂栬緫鏃跺垹闄ら檮浠� +export function delLedgerFile(query) { + return request({ + url: "/sales/ledger/delLedgerFile", + method: "delete", + data: query, + }); +} + +// 閿�鍞笉鍒嗛〉鏌ヨ +export function ledgerListNoPage(query) { + return request({ + url: "/sales/ledger/listNoPage", + method: "get", + params: query, + }); +} + +// 鍒嗛〉鏌ヨ +export function ledgerListPage(query) { + return request({ + url: "/sales/ledger/listPage", + method: "get", + params: query, + }); +} + +// 鏍规嵁閿�鍞悎鍚屽彿鏌ヤ骇鍝佷俊鎭� +export function getProductInfoByContractNo(query) { + return request({ + url: "/purchase/ledger/getProductBySalesNo", + method: "get", + params: query, + }); +} diff --git a/src/main.js b/src/main.js index 021ac8f..fc8d022 100644 --- a/src/main.js +++ b/src/main.js @@ -2,6 +2,8 @@ import plugins from './plugins' import store from './store' import uviewPlus from 'uview-plus' +import Vant from 'vant'; +import 'vant/lib/index.css'; import { createSSRApp } from 'vue' @@ -17,6 +19,7 @@ app.use(store) app.use(uviewPlus) app.use(plugins) + app.use(Vant) // #ifndef MP-WEIXIN // 寰俊灏忕▼搴忎腑涓嶆敮鎸佽嚜瀹氫箟鎸囦护 diff --git a/src/pages.json b/src/pages.json index 7a30555..ef5ee74 100644 --- a/src/pages.json +++ b/src/pages.json @@ -50,6 +50,20 @@ } }, { + "path": "pages/sales/salesAccount/index", + "style": { + "navigationBarTitleText": "閿�鍞彴璐�", + "navigationStyle": "custom" + } + }, + { + "path": "pages/sales/salesAccount/detail", + "style": { + "navigationBarTitleText": "鍙拌处璇︽儏", + "navigationStyle": "custom" + } + }, + { "path": "pages/common/webview/index", "style": { "navigationBarTitleText": "娴忚缃戦〉" diff --git a/src/pages/index.vue b/src/pages/index.vue index 3cad7a1..e35f5e3 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -1,43 +1,155 @@ <template> <view class="content"> - <view> + <view class="header-section"> <view class="currentFactory"> - <up-text type="primary" :text="userStore.currentFactoryName" @click="show = true" + <up-text type="primary" :text="userStore.currentFactoryName" @click="show = true" size="18" class="factoryName" suffixIcon="arrow-right" :iconStyle="iconStyle"></up-text> </view> <up-picker :show="show" :columns="factoryList" @confirm="changeFactory"></up-picker> - <view> - <view class="bg-img"></view> - </view> + </view> + + <view class="hero-section"> <view class="bg-img"> + <view class="hero-content"> + <text class="hero-title">浜у搧搴撳瓨绠$悊绯荤粺</text> + </view> + </view> + </view> + + <view class="notice-section"> + <view class="notice"> + <view class="notice-content"> + <view class="notice-left"> + <text class="notice-status">馃搳 瀹炴椂鐩戞帶</text> + </view> + <view class="notice-separator"></view> + <view class="notice-right"> + <text class="notice-label">{{currentStatus}}</text> + <text class="notice-text">褰撴棩閿�鍞澶囨暟:<text class="notice-number">{{number}}<text class="notice-unit">涓�</text></text></text> + </view> + </view> + </view> + </view> + + <!-- 钀ラ攢绠$悊妯″潡 --> + <view class="common-module marketing-module"> + <view class="module-header"> + <view class="module-title-container"> + <text class="module-title">钀ラ攢绠$悊</text> + </view> + </view> + <view class="module-content"> <up-grid :border="false" col="4" > <up-grid-item - v-for="(listItem,listIndex) in list" - :key="listIndex" + v-for="(item, index) in marketingItems" + :key="index" + @click="handleCommonItemClick(item)" > - <up-icon - :customStyle="{paddingTop:20+'rpx'}" - :name="listItem.name" - :size="22" - ></up-icon> - <text class="grid-text">{{listItem.title}}</text> + <view class="icon-container" :style="{ background: item.bgColor }"> + <up-icon + :name="item.icon" + :size="26" + color="#ffffff" + ></up-icon> + </view> + <text class="item-label">{{item.label}}</text> </up-grid-item> </up-grid> </view> </view> -<!-- <view class="select-container">--> -<!-- <up-picker-data--> -<!-- class="picker"--> -<!-- v-model="currentFatoryId"--> -<!-- title="璇烽�夋嫨鍏徃"--> -<!-- :options="factoryList"--> -<!-- valueKey="id"--> -<!-- labelKey="name">--> -<!-- </up-picker-data>--> -<!-- </view>--> + + <!-- 閲囪喘绠$悊妯″潡 --> + <view class="common-module purchase-module"> + <view class="module-header"> + <view class="module-title-container"> + <text class="module-title">閲囪喘绠$悊</text> + </view> + </view> + <view class="module-content"> + <up-grid + :border="false" + col="4" + > + <up-grid-item + v-for="(item, index) in purchaseItems" + :key="index" + @click="handleCommonItemClick(item)" + > + <view class="icon-container" :style="{ background: item.bgColor }"> + <up-icon + :name="item.icon" + :size="26" + color="#ffffff" + ></up-icon> + </view> + <text class="item-label">{{item.label}}</text> + </up-grid-item> + </up-grid> + </view> + </view> + + <!-- 鍗忓悓鍔炲叕妯″潡 --> + <view class="common-module collaboration-module"> + <view class="module-header"> + <view class="module-title-container"> + <text class="module-title">鍗忓悓鍔炲叕</text> + </view> + </view> + <view class="module-content"> + <up-grid + :border="false" + col="4" + > + <up-grid-item + v-for="(item, index) in collaborationItems" + :key="index" + @click="handleCommonItemClick(item)" + > + <view class="icon-container" :style="{ background: item.bgColor }"> + <up-icon + :name="item.icon" + :size="26" + color="#ffffff" + ></up-icon> + </view> + <text class="item-label">{{item.label}}</text> + </up-grid-item> + </up-grid> + </view> + </view> + + <!-- 璁惧绠$悊妯″潡 --> + <view class="common-module equipment-module"> + <view class="module-header"> + <view class="module-title-container"> + <text class="module-title">璁惧绠$悊</text> + </view> + </view> + <view class="module-content"> + <up-grid + :border="false" + col="4" + > + <up-grid-item + v-for="(item, index) in equipmentItems" + :key="index" + @click="handleCommonItemClick(item)" + > + <view class="icon-container" :style="{ background: item.bgColor }"> + <up-icon + :name="item.icon" + :size="26" + color="#ffffff" + ></up-icon> + </view> + <text class="item-label">{{item.label}}</text> + </up-grid-item> + </up-grid> + </view> + </view> </view> </template> @@ -53,36 +165,142 @@ const factoryList = ref([]); const factoryListTem = ref([]); const iconStyle = { - fontSize: '14px', - color: '#165DFF' + fontSize: '18px', + color: '#2979ff' } -// 鍒涘缓鍝嶅簲寮忔暟鎹� -const list = reactive([ + +// 閫氱煡鐘舵�佸垏鎹� +const statusList = ['閿�鍞�', '閲囪喘'] +let statusIndex = 0 +const currentStatus = ref(statusList[0]) +const number = ref(7643) + +// 瀹氭椂鍣ㄥ垏鎹㈤�氱煡鐘舵�� +const startStatusTimer = () => { + setInterval(() => { + statusIndex = (statusIndex + 1) % statusList.length + currentStatus.value = statusList[statusIndex] + }, 3000) +} + +// 钀ラ攢绠$悊鍔熻兘鏁版嵁 +const marketingItems = reactive([ { - name: 'photo', - title: '鍥剧墖' + icon: 'account', + label: '閿�鍞彴璐�', + bgColor: '#2979ff' }, { - name: 'lock', - title: '閿佸ご' + icon: 'home', + label: '寮�绁ㄧ櫥璁�', + bgColor: '#1976d2' }, { - name: 'star', - title: '鏄熸槦' + icon: 'file-text', + label: '寮�绁ㄥ彴璐�', + bgColor: '#42a5f5' }, { - name: 'hourglass', - title: '娌欐紡' + icon: 'shopping-cart', + label: '鍥炴鐧昏', + bgColor: '#64b5f6' }, { - name: 'home', - title: '棣栭〉' + icon: 'chat', + label: '鍥炴娴佹按', + bgColor: '#90caf9' }, { - name: 'volume', // 娉ㄦ剰锛氳繖閲屼慨鏀逛簡 name 浠� 'star' 鏀逛负 'volume'锛屼互閬垮厤鍒楄〃涓袱涓厓绱犲叿鏈夌浉鍚岀殑 name - title: '闊抽噺' + icon: 'chat', + label: '瀹㈡埛寰�鏉�', + bgColor: '#90caf9' + } +]); + +// 閲囪喘绠$悊鍔熻兘鏁版嵁 +const purchaseItems = reactive([ + { + icon: 'order', + label: '閲囪喘鍙拌处', + bgColor: '#bbdefb' + }, + { + icon: 'truck', + label: '鏉ョエ鐧昏', + bgColor: '#e3f2fd' + }, + { + icon: 'box', + label: '鏉ョエ鍙拌处', + bgColor: '#f3e5f5' + }, + { + icon: 'chart-line', + label: '浠樻鐧昏', + bgColor: '#e8eaf6' + }, + { + icon: 'settings', + label: '浠樻娴佹按', + bgColor: '#f1f8e9' + }, + { + icon: 'settings', + label: '渚涘簲鍟嗗線鏉�', + bgColor: '#f1f8e9' }, ]); + +// 鍗忓悓鍔炲叕鍔熻兘鏁版嵁 +const collaborationItems = reactive([ + { + icon: 'checkmark-circle', + label: '鍗忓悓瀹℃壒', + bgColor: '#4caf50' + }, + { + icon: 'map-pin', + label: '瀹㈡埛鎷滆', + bgColor: '#ff9800' + } +]); + +// 璁惧绠$悊鍔熻兘鏁版嵁 +const equipmentItems = reactive([ + { + icon: 'list', + label: '璁惧鍙拌处', + bgColor: '#9c27b0' + }, + { + icon: 'wrench', + label: '璁惧鎶ヤ慨', + bgColor: '#f44336' + }, + { + icon: 'shield-check', + label: '璁惧淇濆吇', + bgColor: '#00bcd4' + } +]); + +// 澶勭悊甯哥敤鍔熻兘鐐瑰嚮 +const handleCommonItemClick = (item) => { + // 鏍规嵁涓嶅悓鐨勫姛鑳介」杩涜璺宠浆 + switch (item.label) { + case '閿�鍞彴璐�': + uni.navigateTo({ + url: '/pages/sales/salesAccount/index' + }); + break; + default: + uni.showToast({ + title: `鐐瑰嚮浜�${item.label}`, + icon: 'none' + }); + } +}; + // 鍒涘缓瀵瑰瓙缁勪欢鐨勫紩鐢� const uToastRef = ref(null); @@ -140,34 +358,421 @@ // 璁剧疆鐢ㄦ埛淇℃伅 userStore.getInfo() getUserLoginFacotryList() + // 鍚姩閫氱煡鐘舵�佸畾鏃跺櫒 + startStatusTimer() }); </script> <style scoped lang="scss"> .content { - background-color: transparent !important; - padding: 14px; + background: linear-gradient(135deg, #f8f9fa 0%, #e3f2fd 100%); + min-height: 100vh; + padding: 20px; + padding-top: env(safe-area-inset-top); + position: relative; + + &::before { + content: ''; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="dots" width="20" height="20" patternUnits="userSpaceOnUse"><circle cx="10" cy="10" r="1" fill="rgba(41, 121, 255, 0.03)"/></pattern></defs><rect width="100" height="100" fill="url(%23dots)"/></svg>'); + pointer-events: none; + z-index: -1; + } + + &::after { + content: ''; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: radial-gradient(circle at 20% 80%, rgba(41, 121, 255, 0.02) 0%, transparent 50%), + radial-gradient(circle at 80% 20%, rgba(156, 39, 176, 0.02) 0%, transparent 50%); + pointer-events: none; + z-index: -1; + } } + +/* 鏈〉涓嶅啀瀹氫箟 .safe-area-top锛屽凡绉昏嚦鍏ㄥ眬鏍峰紡 */ + +.header-section { + margin-bottom: 16px; + animation: fadeInDown 0.6s ease-out; +} + .currentFactory { - margin-top: 12px; - margin-left: 6px; - font-weight: 400; - font-size: 14px; + margin-top: 8px; + margin-left: 4px; + font-weight: 500; display: flex; } + .factoryName { width: auto; } + :deep(.u-text) { - align-items: flex-end; + align-items: center; } + +.hero-section { + margin-bottom: 16px; + animation: fadeInUp 0.6s ease-out 0.1s both; +} + .bg-img { - margin-top: 12px; width: 100%; - height: 145px; - background-color: #ffffff; - border-radius: 10px 10px 10px 10px; + height: 120px; + background: linear-gradient(135deg, #2979ff 0%, #1565c0 100%); + border-radius: 12px; + position: relative; + overflow: hidden; + box-shadow: 0 4px 20px rgba(41, 121, 255, 0.15); + + &::before { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: conic-gradient(from 0deg, transparent, rgba(255,255,255,0.1), transparent, rgba(255,255,255,0.05), transparent); + animation: rotate 20s linear infinite; + } + + &::after { + content: ''; + position: absolute; + top: 0; + right: 0; + width: 120px; + height: 120px; + background: radial-gradient(circle, rgba(255,255,255,0.15) 0%, transparent 70%); + border-radius: 50%; + transform: translate(40px, -40px); + } } + +.hero-content { + position: relative; + z-index: 1; + padding: 20px; + height: 100%; + display: flex; + align-items: center; +} + +.hero-title { + color: #ffffff; + font-size: 24px; + font-weight: 600; +} + + + +.notice-section { + margin-bottom: 16px; + animation: fadeInUp 0.6s ease-out 0.2s both; +} + +.notice { + width: 100%; + background: linear-gradient(135deg, #EAF2FF 0%, #BBDEFB 100%); + border: 1px solid #e3f2fd; + border-radius: 12px; + padding: 16px; + box-shadow: 0 4px 20px rgba(41, 121, 255, 0.08); + position: relative; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: linear-gradient(45deg, transparent, rgba(255,255,255,0.6), transparent); + animation: shine 4s infinite; + } + + &::after { + content: ''; + position: absolute; + top: 0; + right: 0; + width: 80px; + height: 80px; + background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 70%); + border-radius: 50%; + transform: translate(30px, -30px); + } +} + + + +@keyframes shine { + 0% { + transform: translateX(-100%) translateY(-100%) rotate(45deg); + } + 100% { + transform: translateX(100%) translateY(100%) rotate(45deg); + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + transform: translateY(-20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.notice-content { + display: flex; + align-items: center; + height: 100%; + position: relative; + z-index: 1; +} + +.notice-left { + margin-right: 16px; +} + +.notice-status { + font-weight: 600; + font-size: 16px; + color: #1976d2; +} + +.notice-separator { + width: 1px; + height: 24px; + background: #e0e0e0; + margin-right: 16px; +} + +.notice-right { + display: flex; + align-items: center; + justify-content: space-between; + flex: 1; +} + +.notice-label { + color: #1976d2; + font-size: 14px; + font-weight: 500; + margin-right: 12px; +} + +.notice-text { + font-weight: 400; + font-size: 14px; + color: #666666; +} + +.notice-number { + font-weight: 600; + font-size: 16px; + color: #1976d2; + margin-left: 4px; +} + +.notice-unit { + color: #666666; + font-size: 14px; + margin-left: 2px; +} + +/* 鍔熻兘妯″潡鏍峰紡 */ +.common-module { + margin-bottom: 24px; + background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%); + border-radius: 16px; + padding: 16px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06); + border: none; + position: relative; + overflow: hidden; + transition: all 0.3s ease; + + &::after { + content: ''; + position: absolute; + top: 0; + right: 0; + width: 60px; + height: 60px; + background: radial-gradient(circle, rgba(0,0,0,0.02) 0%, transparent 70%); + border-radius: 50%; + transform: translate(30px, -30px); + } + + &:hover { + transform: translateY(-2px); + box-shadow: 0 8px 30px rgba(0, 0, 0, 0.1); + + &::after { + background: radial-gradient(circle, rgba(0,0,0,0.04) 0%, transparent 70%); + } + } +} + +.marketing-module { + --module-color: #2979ff; +} + +.purchase-module { + --module-color: #1976d2; +} + +.collaboration-module { + --module-color: #4caf50; +} + +.equipment-module { + --module-color: #9c27b0; +} + +.module-header { + margin-bottom: 24px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.module-title-container { + display: flex; + align-items: center; +} + +.module-title { + color: #333333; + font-size: 18px; + font-weight: 600; + position: relative; + + &::after { + content: ''; + position: absolute; + bottom: -4px; + left: 0; + width: 100%; + height: 2px; + background: linear-gradient(90deg, var(--module-color), rgba(255,255,255,0.9)); + border-radius: 1px; + transition: all 0.3s ease; + box-shadow: 0 0 8px rgba(0,0,0,0.1); + } + + &:hover::after { + width: 30px; + box-shadow: 0 0 12px rgba(0,0,0,0.15); + } +} + +.module-subtitle { + color: #666666; + font-size: 12px; + font-weight: 400; + margin-left: 8px; +} + +.module-content { + width: 100%; + display: grid; + gap: 16px; +} + +.icon-container { + width: 52px; + height: 52px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 6px; + box-shadow: 0 3px 12px rgba(0, 0, 0, 0.12); + transition: all 0.3s ease; + position: relative; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, rgba(255,255,255,0.1) 0%, transparent 50%, rgba(255,255,255,0.05) 100%); + opacity: 0; + transition: opacity 0.3s ease; + } + + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: 12px; + background: linear-gradient(45deg, transparent, rgba(255,255,255,0.2), transparent); + opacity: 0; + transition: opacity 0.3s ease; + } + + &:hover { + transform: translateY(-3px) scale(1.02); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.18); + + &::before, + &::after { + opacity: 1; + } + } +} + +.item-label { + font-size: 13px; + color: #555555; + text-align: center; + display: block; + line-height: 1.4; + font-weight: 500; + margin-top: 4px; + margin-bottom: 10px; +} + .grid-text { font-size: 14px; color: #909399; @@ -176,4 +781,6 @@ box-sizing: border-box; /* #endif */ } + + </style> diff --git a/src/pages/login.vue b/src/pages/login.vue index a2e0d33..d970266 100644 --- a/src/pages/login.vue +++ b/src/pages/login.vue @@ -1,8 +1,6 @@ <template> <view class="normal-login-container"> <view class="logo-content"> -<!-- <image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">--> -<!-- </image>--> <text>璐﹀彿瀵嗙爜鐧诲綍</text> </view> <view class="login-form-content"> @@ -171,9 +169,10 @@ .normal-login-container { width: 100%; + height: 100vh; .logo-content { - width: 100%; + width: 90%; font-weight: 400; font-size: 30px; color: #333333; diff --git a/src/pages/sales/salesAccount/detail.vue b/src/pages/sales/salesAccount/detail.vue new file mode 100644 index 0000000..098c609 --- /dev/null +++ b/src/pages/sales/salesAccount/detail.vue @@ -0,0 +1,279 @@ +<template> + <view class="account-detail"> + <!-- 椤堕儴鏍囬鏍� --> + <view class="header"> + <up-icon name="arrow-left" size="20" color="#333" @click="goBack" /> + <text class="title">鍙拌处璇︽儏</text> + </view> + + <!-- 琛ㄥ崟鍖哄煙 --> + <view class="form-section"> + <van-form ref="formRef" :modelValue="form" :rules="rules" label-width="100px" input-align="right"> + <van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"> + </van-field> + <van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"> + </van-field> + <van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"> + </van-field> + <van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"> + </van-field> + <van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"> + </van-field> + <van-field label="閿�鍞悎鍚屽彿" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"> + </van-field> + <van-field label="褰曞叆浜�" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏�" readonly> + </van-field> + <van-field label="褰曞叆鏃ユ湡" name="salesContractNo" borderBottom="true" v-model="form.salesContractNo" placeholder="璇疯緭鍏�" readonly> + </van-field> + </van-form> + </view> + + <!-- 浜у搧淇℃伅 --> + <view class="product-section"> + <view class="section-header"> + <text class="section-title">浜у搧淇℃伅</text> + <button class="add-btn" @click="addProduct">鏂板</button> + </view> + <view class="product-card" v-for="(product, idx) in products" :key="idx"> + <view class="product-row"> + <text class="product-label">浜у搧绫�</text> + <uni-easyinput v-model="product.type" placeholder="璇疯緭鍏ヤ骇鍝佺被" /> + </view> + <view class="product-row"> + <text class="product-label">鍗曚綅</text> + <uni-easyinput v-model="product.unit" placeholder="璇疯緭鍏ュ崟浣�" /> + <text class="product-label">鏁伴噺</text> + <uni-easyinput v-model="product.amount" placeholder="璇疯緭鍏ユ暟閲�" type="number" /> + </view> + <view class="product-row"> + <text class="product-label">绋庣巼</text> + <uni-easyinput v-model="product.taxRate" placeholder="璇疯緭鍏ョ◣鐜�" /> + <text class="product-label">鍚◣鍗曚环</text> + <uni-easyinput v-model="product.taxPrice" placeholder="璇疯緭鍏ュ惈绋庡崟浠�" /> + </view> + <view class="product-row"> + <text class="product-label">鍚◣鎬讳环</text> + <uni-easyinput v-model="product.taxTotal" placeholder="璇疯緭鍏ュ惈绋庢�讳环" /> + <text class="product-label">鍚堝悓閲戦</text> + <uni-easyinput v-model="product.contractAmount" placeholder="璇疯緭鍏ュ悎鍚岄噾棰�" /> + </view> + <view class="product-row"> + <text class="product-label">鎿嶄綔</text> + <uni-easyinput v-model="product.operateDate" placeholder="璇疯緭鍏ユ搷浣滄椂闂�" /> + </view> + <view class="product-row"> + <text class="product-label">澶囨敞</text> + <uni-easyinput v-model="product.remark" placeholder="璇疯緭鍏ュ娉�" /> + </view> + <view class="product-row del-row"> + <button class="del-btn" @click="removeProduct(idx)">鍒犻櫎</button> + </view> + </view> + </view> + + <!-- 搴曢儴鎸夐挳 --> + <view class="footer-btns"> + <van-button class="cancel-btn" @click="goBack">鍙栨秷</van-button> + <van-button class="save-btn" @click="submitForm">淇濆瓨</van-button> + </view> + </view> +</template> + +<script setup> +import { ref } from 'vue'; +const goBack = () => { + uni.navigateBack(); +}; +const formRef = ref(); +const paymentMethods = ['瀵瑰叕杞处', '鐜伴噾', '鍏朵粬']; +const form = ref({ + salesContractNo: '', + customerContract: '', + projectName: '', + contractAmount: '', + executionDate: '', + paymentMethod: '', +}); +const rules = { + salesContractNo: { + rules: [{ required: true, errorMessage: '閿�鍞悎鍚屽彿涓嶈兘涓虹┖' }] + }, + customerContract: { + rules: [{ required: true, errorMessage: '瀹㈡埛鍚堝悓涓嶈兘涓虹┖' }] + }, + projectName: { + rules: [{ required: true, errorMessage: '椤圭洰鍚嶇О涓嶈兘涓虹┖' }] + }, + contractAmount: { + rules: [{ required: true, errorMessage: '鍚堝悓閲戦涓嶈兘涓虹┖' }] + }, + executionDate: { + rules: [{ required: true, errorMessage: '绛捐鏃ユ湡涓嶈兘涓虹┖' }] + }, + paymentMethod: { + rules: [{ required: true, errorMessage: '璇烽�夋嫨浠樻鏂瑰紡' }] + } +}; +const products = ref([ + { + type: 'LS-29911', + unit: '鍛ㄥ簞闀�', + amount: '86590905972612', + taxRate: '杩欓噷鏄」鐩悕绉�', + taxPrice: '杩欓噷鏄」鐩悕绉�', + taxTotal: '杩欓噷鏄」鐩悕绉�', + contractAmount: '32011鍏�', + operateDate: '2022-02-22 11:30:50', + remark: '', + }, + { + type: 'LS-29911', + unit: '鍛ㄥ簞闀�', + amount: '86590905972612', + taxRate: '杩欓噷鏄」鐩悕绉�', + taxPrice: '杩欓噷鏄」鐩悕绉�', + taxTotal: '杩欓噷鏄」鐩悕绉�', + contractAmount: '32011鍏�', + operateDate: '2022-02-22 11:30:50', + remark: '', + }, +]); +const addProduct = () => { + products.value.push({ + type: '', + unit: '', + amount: '', + taxRate: '', + taxPrice: '', + taxTotal: '', + contractAmount: '', + operateDate: '', + remark: '', + }); +}; +const removeProduct = (idx) => { + products.value.splice(idx, 1); +}; +const submitForm = () => { + formRef.value.validate().then(() => { + uni.showToast({ title: '淇濆瓨鎴愬姛', icon: 'success' }); + }); +}; +</script> + +<style scoped lang="scss"> +.account-detail { + min-height: 100vh; + background: #f8f9fa; + padding-bottom: 80px; +} +.header { + display: flex; + align-items: center; + background: #fff; + padding: 16px 20px; + border-bottom: 1px solid #f0f0f0; + position: sticky; + top: 0; + z-index: 100; +} +.title { + flex: 1; + text-align: center; + font-size: 18px; + font-weight: 600; + color: #333; +} +.form-section { + margin-top: 16px; +} +.van-field { + height: 56px; + line-height: 36px; +} +.product-section { + background: #fff; + margin: 16px; + border-radius: 16px; + padding: 20px 16px 8px 16px; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); +} +.section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; +} +.section-title { + font-size: 16px; + font-weight: 600; + color: #333; +} +.add-btn { + background: #2979ff; + color: #fff; + border-radius: 8px; + padding: 4px 16px; + font-size: 14px; +} +.product-card { + background: #f8f9fa; + border-radius: 12px; + padding: 12px; + margin-bottom: 16px; + box-shadow: 0 1px 4px rgba(41,121,255,0.06); + position: relative; +} +.product-row { + display: flex; + align-items: center; + margin-bottom: 8px; +} +.product-label { + min-width: 60px; + color: #888; + font-size: 13px; +} +.del-row { + justify-content: flex-end; +} +.del-btn { + background: #ff4d4f; + color: #fff; + border-radius: 8px; + padding: 4px 16px; + font-size: 13px; + margin-top: 4px; +} +.footer-btns { + position: fixed; + left: 0; + right: 0; + bottom: 0; + background: #fff; + display: flex; + justify-content: space-around; + align-items: center; + padding: 12px 0; + box-shadow: 0 -2px 8px rgba(0,0,0,0.05); + z-index: 1000; +} +.cancel-btn { + font-weight: 400; + font-size: 16px; + color: #FFFFFF; + width: 102px; + background: #C7C9CC; + box-shadow: 0px 4px 10px 0px rgba(3,88,185,0.2); + border-radius: 40px 40px 40px 40px; +} +.save-btn { + font-weight: 400; + font-size: 16px; + color: #FFFFFF; + width: 224px; + background: linear-gradient( 140deg, #00BAFF 0%, #006CFB 100%); + box-shadow: 0px 4px 10px 0px rgba(3,88,185,0.2); + border-radius: 40px 40px 40px 40px; +} +</style> diff --git a/src/pages/sales/salesAccount/index.vue b/src/pages/sales/salesAccount/index.vue new file mode 100644 index 0000000..e2e0b65 --- /dev/null +++ b/src/pages/sales/salesAccount/index.vue @@ -0,0 +1,392 @@ +<template> + <view class="sales-account"> + <!-- 椤甸潰澶撮儴 --> + <view class="page-header"> + <view class="header-left"> + <up-icon name="arrow-left" size="20" color="#333" @click="goBack"></up-icon> + </view> + <view class="header-center"> + <text class="page-title">閿�鍞彴璐�</text> + </view> + </view> + + <!-- 鎼滅储鍜岀瓫閫夊尯鍩� --> + <view class="search-filter-section"> + <view class="search-bar"> + <view class="search-input"> + <input + class="search-text" + placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿/瀹㈡埛鍚嶇О" + v-model="searchKeyword" + /> + </view> + <view class="filter-button" @click="getList"> + <up-icon name="search" size="24" color="#999"></up-icon> + </view> + </view> + </view> + + <!-- 閿�鍞彴璐︾�戝竷娴� --> + <view class="ledger-list" v-if="total > 0"> + <view v-for="(item, index) in ledgerList" :key="index"> + <view class="ledger-item" @click="handleItemClick(item)"> + <view class="item-header"> + <view class="item-left"> + <view class="document-icon"> + <up-icon name="file-text" size="16" color="#ffffff"></up-icon> + </view> + <text class="item-id">{{ item.salesContractNo }}</text> + </view> + <!-- <view class="item-tag">--> + <!-- <text class="tag-text">{{ item.recorder }}</text>--> + <!-- </view>--> + </view> + <up-divider></up-divider> + + <view class="item-details"> + <view class="detail-row"> + <text class="detail-label">瀹㈡埛鍚嶇О</text> + <text class="detail-value">{{ item.customerName }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">瀹㈡埛鍚堝悓鍙�</text> + <text class="detail-value highlight">{{ item.customerContractNo }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">涓氬姟鍛�</text> + <text class="detail-value">{{ item.salesman }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">椤圭洰鍚嶇О</text> + <text class="detail-value">{{ item.projectName }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">浠樻鏂瑰紡</text> + <text class="detail-value">{{ item.paymentMethod }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">鍚堝悓閲戦(鍏�)</text> + <text class="detail-value highlight">{{ item.contractAmount }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">绛捐鏃ユ湡</text> + <text class="detail-value">{{ item.executionDate }}</text> + </view> + <up-divider></up-divider> + <view class="detail-info"> + <view class="detail-row"> + <text class="detail-label">褰曞叆浜�</text> + <text class="detail-value">{{ item.entryPersonName }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">褰曞叆鏃ユ湡</text> + <text class="detail-value">{{ item.entryDate }}</text> + </view> + </view> + </view> + </view> + </view> + </view> + <view v-else class="no-data"> + <text>鏆傛棤閿�鍞彴璐︽暟鎹�</text> + </view> + + <!-- 娴姩鎿嶄綔鎸夐挳 --> + <view class="fab-button" @click="handleAdd"> + <up-icon name="plus" size="24" color="#ffffff"></up-icon> + </view> + </view> +</template> + +<script setup> +import { ref, reactive, onMounted } from 'vue'; +import {ledgerListPage} from "@/api/salesManagement/salesLedger"; + +// 鎼滅储鍏抽敭璇� +const searchKeyword = ref(''); + +// 閿�鍞彴璐︽暟鎹� +const ledgerList = ref([]); +const total = ref(0); + +// 杩斿洖涓婁竴椤� +const goBack = () => { + uni.navigateBack(); +}; +// 鏌ヨ鍒楄〃 +const getList = () => { + const page = { + current: -1, + size: -1 + } + ledgerListPage({...page}).then((res) => { + ledgerList.value = res.records; + total.value = res.total; + }).catch(() => { + // tableLoading.value = false; + }); +}; +// 鏄剧ず绛涢�夐�夐」 +const showFilterOptions = () => { + uni.showActionSheet({ + itemList: ['鎸夋棩鏈熺瓫閫�', '鎸夌姸鎬佺瓫閫�', '鎸夐噾棰濈瓫閫�'], + success: (res) => { + console.log('閫夋嫨浜嗙瓫閫夐�夐」:', res.tapIndex); + } + }); +}; + +// 鐐瑰嚮鍒楄〃椤� +const handleItemClick = (item) => { + uni.showToast({ + title: `鏌ョ湅鍚堝悓: ${item.contractId}`, + icon: 'none' + }); +}; + +// 娣诲姞鏂拌褰� +const handleAdd = () => { + uni.navigateTo({ + url: '/pages/sales/salesAccount/detail' + }); +}; + +onMounted(() => { + // 椤甸潰鍔犺浇瀹屾垚鍚庣殑鍒濆鍖栭�昏緫 + getList() +}); +</script> + +<style scoped lang="scss"> +.u-divider { + margin: 0 !important; +} +.sales-account { + min-height: 100vh; + background: #f8f9fa; + position: relative; +} + +.page-header { + background: #ffffff; + padding: 16px 20px; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid #f0f0f0; + position: sticky; + /* 鍏煎 iOS 鍒樻捣/鐏靛姩宀涘畨鍏ㄥ尯 */ + padding-top: env(safe-area-inset-top); + top: 0; + z-index: 100; +} + +.header-left { + display: flex; + align-items: center; + gap: 8px; +} + +.nav-icon { + width: 24px; + height: 24px; + background: #2979ff; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; +} + +.nav-text { + font-size: 14px; + color: #2979ff; + font-weight: 500; +} + +.header-center { + flex: 1; + text-align: center; +} + +.page-title { + font-size: 18px; + font-weight: 600; + color: #333; +} + +.header-right { + display: flex; + align-items: center; +} + +.status-bar { + display: flex; + align-items: center; + gap: 4px; +} + +.signal, .wifi, .battery { + width: 16px; + height: 8px; + background: #333; + border-radius: 2px; +} + +.search-filter-section { + padding: 10px 20px; + background: #ffffff; +} + +.search-bar { + display: flex; + align-items: center; + gap: 12px; +} + +.search-input { + flex: 1; + background: #f5f5f5; + border-radius: 24px; + padding: 10px 16px; + display: flex; + align-items: center; + gap: 8px; +} + +.search-text { + flex: 1; + font-size: 14px; + color: #333; + background: transparent; + border: none; + outline: none; +} + +.search-text::placeholder { + color: #999; +} + +.filter-button { + width: 40px; + height: 40px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; +} + +.ledger-list { + padding: 20px; +} + +.ledger-item { + background: #ffffff; + border-radius: 12px; + margin-bottom: 16px; + overflow: hidden; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + padding: 0 16px; +} + +.item-header { + padding: 16px 0; + display: flex; + align-items: center; + justify-content: space-between; +} + +.item-left { + display: flex; + align-items: center; + gap: 8px; +} + +.document-icon { + width: 24px; + height: 24px; + background: #2979ff; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; +} + +.item-id { + font-size: 14px; + color: #333; + font-weight: 500; +} + +.item-tag { + background: #4caf50; + border-radius: 4px; + padding: 2px 4px; +} + +.tag-text { + font-size: 11px; + color: #ffffff; + font-weight: 500; +} + +.item-details { + padding: 16px 0; +} + +.detail-row { + display: flex; + align-items: flex-end; + justify-content: space-between; + margin-bottom: 8px; + + &:last-child { + margin-bottom: 0; + } +} +.detail-info { + margin-top: 10px; + display: flex; + align-items: flex-start; + justify-content: space-between; +} + +.detail-label { + font-size: 12px; + color: #777777; + min-width: 60px; +} + +.detail-value { + font-size: 12px; + color: #000000; + text-align: right; + flex: 1; + margin-left: 16px; +} + +.detail-value.highlight { + color: #2979ff; + font-weight: 500; +} + +.no-data { + padding: 40px 0; + text-align: center; + color: #999; +} + +.fab-button { + position: fixed; + bottom: 30px; + right: 30px; + width: 56px; + height: 56px; + background: #2979ff; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 4px 16px rgba(41, 121, 255, 0.3); + z-index: 1000; +} +</style> -- Gitblit v1.9.3