From 451c79860be3a1fca7270309831dc9c567a26b27 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期二, 19 八月 2025 09:13:09 +0800
Subject: [PATCH] 审批管理/审批流程
---
src/pages/index.vue | 10
src/pages.json | 23 +
src/pages/cooperativeOffice/collaborativeApproval/index.vue | 390 ++++++++++++++++++++
src/api/cooperativeOffice/collaborativeApproval.js | 111 +++++
src/pages/cooperativeOffice/collaborativeApproval/detail.vue | 535 ++++++++++++++++++++++++++++
src/pages/cooperativeOffice/clientVisit/index.vue | 51 ++
6 files changed, 1,120 insertions(+), 0 deletions(-)
diff --git a/src/api/cooperativeOffice/collaborativeApproval.js b/src/api/cooperativeOffice/collaborativeApproval.js
new file mode 100644
index 0000000..3a2fa22
--- /dev/null
+++ b/src/api/cooperativeOffice/collaborativeApproval.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/pages.json b/src/pages.json
index ef5ee74..2427323 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -74,6 +74,29 @@
"style": {
"navigationBarTitleText": "娴忚鏂囨湰"
}
+ },
+ //鍗忓悓瀹℃壒
+ {
+ "path": "pages/cooperativeOffice/collaborativeApproval/index",
+ "style": {
+ "navigationBarTitleText": "瀹℃壒绠$悊",
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/cooperativeOffice/collaborativeApproval/detail",
+ "style": {
+ "navigationBarTitleText": "瀹℃壒娴佺▼",
+ "navigationStyle": "custom"
+ }
+ },
+ //瀹㈡埛鎷滆
+ {
+ "path": "pages/cooperativeOffice/clientVisit/index",
+ "style": {
+ "navigationBarTitleText": "瀹㈡埛鎷滆",
+ "navigationStyle": "custom"
+ }
}
],
"subPackages": [
diff --git a/src/pages/cooperativeOffice/clientVisit/index.vue b/src/pages/cooperativeOffice/clientVisit/index.vue
new file mode 100644
index 0000000..f83d156
--- /dev/null
+++ b/src/pages/cooperativeOffice/clientVisit/index.vue
@@ -0,0 +1,51 @@
+// 瀹㈡埛鎷滆
+<template>
+ <view>
+ <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>
+</template>
+<script>
+export default {
+ data() {
+ return {
+ title: '瀹㈡埛鎷滆'
+ }
+ },
+ methods: {
+ goBack() {
+ uni.navigateBack({
+ delta: 1
+ })
+ }
+ }
+}
+</script>
+<style>
+.page-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 10px 20px;
+ background-color: #f5f5f5;
+}
+.header-left {
+ display: flex;
+ align-items: center;
+}
+.header-center {
+ flex: 1;
+ text-align: center;
+}
+.page-title {
+ font-size: 18px;
+ font-weight: bold;
+}
+</style>
+
diff --git a/src/pages/cooperativeOffice/collaborativeApproval/detail.vue b/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
new file mode 100644
index 0000000..362b237
--- /dev/null
+++ b/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
@@ -0,0 +1,535 @@
+<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" @submit="submitForm" :rules="rules" input-align="right">
+ <van-cell-group inset style="height:auto">
+ <van-field
+ v-model="taxPrice"
+ name="taxPrice"
+ label="濮撳悕"
+ placeholder="璇疯緭鍏ュ鍚�"
+ :rules="[{ required: true, message: '濮撳悕涓嶈兘涓虹┖' }]"
+ required
+ readonly
+ />
+ <van-field
+ v-model="result"
+ readonly
+ name="picker"
+ label="鐢宠閮ㄩ棬"
+ placeholder="璇烽�夋嫨鐢宠閮ㄩ棬"
+ :rules="[{ required: true, message: '璇烽�夋嫨鐢宠閮ㄩ棬' }]"
+ @click="showPicker = true"
+ required
+ />
+ <van-popup
+ v-model:show="showPicker"
+ destroy-on-close
+ position="bottom"
+ >
+ <van-picker
+ :columns="columns"
+ :model-value="pickerValue"
+ @confirm="onConfirm"
+ @cancel="showPicker = false"
+ />
+ </van-popup>
+ <van-field
+ v-model="message"
+ name="message"
+ rows="1"
+ autosize
+ label="鐢宠浜嬬敱"
+ type="textarea"
+ placeholder="璇疯緭鍏ョ敵璇蜂簨鐢�"
+ height="100"
+ :rules="[{ required: true, message: '鐢宠浜嬬敱涓嶈兘涓虹┖' }]"
+ required
+ />
+ </van-cell-group>
+ </van-form>
+ </view>
+ <!-- 瀹℃牳娴佺▼鍖哄煙 -->
+ <view class="approval-process">
+ <view class="approval-header">
+ <text class="approval-title">瀹℃牳娴佺▼</text>
+ <text class="approval-desc">宸茬敱绠$悊鍛橀璁句笉鍙慨鏀�</text>
+ </view>
+
+ <view class="approval-steps">
+ <view v-for="(step, stepIndex) in approvalSteps" :key="stepIndex" class="approval-step">
+ <view class="step-title">
+ <text>瀹℃壒浜�</text>
+ </view>
+ <view class="approvers-container">
+ <view v-for="(approver, approverIndex) in step.approvers" :key="approverIndex" class="approver-item">
+ <view class="approver-avatar"></view>
+ <text class="approver-name">{{ approver.name }}</text>
+ <view class="delete-approver-btn" @click="removeApprover(stepIndex, approverIndex)">脳</view>
+ </view>
+ <view class="add-approver-btn" @click="addApprover(stepIndex)">+
+ </view>
+ </view>
+ <view class="step-line" v-if="stepIndex < approvalSteps.length - 1"></view>
+ <view class="delete-step-btn" @click="removeApprovalStep(stepIndex)">鍒犻櫎鑺傜偣</view>
+ </view>
+ </view>
+
+ <view class="add-step-btn" @click="addApprovalStep">
+ <text>鏂板鑺傜偣瀹℃牳浜�</text>
+ </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>
+import { ref, onMounted } from "vue";
+
+export default {
+ setup() {
+ const rules = ref({
+
+ taxPrice: {
+ rules: [{ required: true, errorMessage: '濮撳悕涓嶈兘涓虹┖' }]
+ },
+ result: {
+ rules: [{ required: true, errorMessage: '璇烽�夋嫨鐢宠閮ㄩ棬' }]
+ },
+ message: {
+ rules: [{ required: true, errorMessage: '鐢宠浜嬬敱涓嶈兘涓虹┖' }]
+ },
+});
+ const result = ref("");
+ const pickerValue = ref([]);
+ const showPicker = ref(false);
+ const columns = ref([]);
+ onMounted(async () => {
+ try {
+ // 鏇挎崲涓哄疄闄呮帴鍙e湴鍧�
+ // const response = await axios.get('/api/getDepartments');
+ columns.value = [
+ {
+ text: "鏉窞",
+ value: "Hangzhou",
+ },
+ {
+ text: "瀹佹尝",
+ value: "Ningbo",
+ },
+ {
+ text: "娓╁窞",
+ value: "Wenzhou",
+ },
+ {
+ text: "缁嶅叴",
+ value: "Shaoxing",
+ },
+ {
+ text: "婀栧窞",
+ value: "Huzhou",
+ },
+ ];
+ } catch (error) {
+ console.error("鑾峰彇閮ㄩ棬鏁版嵁澶辫触:", error);
+ }
+ });
+ const onConfirm = ({ selectedValues, selectedOptions }) => {
+ result.value = selectedOptions[0]?.text;
+ pickerValue.value = selectedValues;
+ showPicker.value = false;
+ };
+ const taxPrice = ref("");
+ const contractAmount = ref("");
+ const approvalSteps = ref([
+ { approvers: [{ name: '鍗㈠皬鏁�' }, { name: '鍗㈠皬鏁�' }] },
+ { approvers: [{ name: '鍗㈠皬鏁�' }] },
+ { approvers: [{ name: '鍗㈠皬鏁�' }] },
+ { approvers: [{ name: '鍗㈠皬鏁�' }] }
+ ]);
+
+ const goBack = () => {
+ uni.navigateBack();
+ };
+
+ const formRef = ref(null);
+
+ const submitForm = () => {
+ formRef.value.validate().then(() => {
+ // 琛ㄥ崟鏍¢獙閫氳繃锛屽彲浠ユ彁浜ゆ暟鎹�
+ console.log("琛ㄥ崟鏁版嵁:", {
+ taxPrice: taxPrice.value,
+ department: result.value,
+ message: message.value,
+ approvalSteps: approvalSteps.value
+ });
+
+ uni.showToast({
+ title: "淇濆瓨鎴愬姛",
+ icon: "success",
+ });
+ }).catch((error) => {
+ console.error("琛ㄥ崟鏍¢獙澶辫触:", error);
+ // 鏄剧ず鍏蜂綋鐨勯敊璇俊鎭�
+ if (error.length > 0) {
+ const firstError = error[0];
+ uni.showToast({
+ title: firstError.message || '琛ㄥ崟鏍¢獙澶辫触',
+ icon: 'none'
+ });
+ } else {
+ uni.showToast({
+ title: '琛ㄥ崟鏍¢獙澶辫触锛岃妫�鏌ュ繀濉」',
+ icon: 'none'
+ });
+ }
+ });
+ };
+
+ const message = ref("");
+
+ const addApprover = (stepIndex) => {
+ // 鍦ㄦ寚瀹氬鎵规楠ゆ坊鍔犳柊鐨勫鎵逛汉
+ approvalSteps.value[stepIndex].approvers.push({ name: '鍗㈠皬鏁�' });
+ };
+
+ const addApprovalStep = () => {
+ // 娣诲姞鏂扮殑瀹℃壒姝ラ
+ approvalSteps.value.push({ approvers: [{ name: '鍗㈠皬鏁�' }] });
+ };
+
+ const removeApprover = (stepIndex, approverIndex) => {
+ // 纭繚姣忎釜姝ラ鑷冲皯淇濈暀涓�涓鎵逛汉
+ if (approvalSteps.value[stepIndex].approvers.length > 1) {
+ approvalSteps.value[stepIndex].approvers.splice(approverIndex, 1);
+ } else {
+ uni.showToast({
+ title: '姣忎釜姝ラ鑷冲皯闇�瑕佷竴涓鎵逛汉',
+ icon: 'none'
+ });
+ }
+ };
+
+ const removeApprovalStep = (stepIndex) => {
+ // 纭繚鑷冲皯淇濈暀涓�涓鎵规楠�
+ if (approvalSteps.value.length > 1) {
+ approvalSteps.value.splice(stepIndex, 1);
+ } else {
+ uni.showToast({
+ title: '鑷冲皯闇�瑕佷竴涓鎵规楠�',
+ icon: 'none'
+ });
+ }
+ };
+
+ return {
+ rules,
+ removeApprovalStep,
+ removeApprover,
+ result,
+ pickerValue,
+ columns,
+ onConfirm,
+ showPicker,
+ taxPrice,
+ contractAmount,
+ goBack,
+ submitForm,
+ approvalSteps,
+ addApprover,
+ addApprovalStep,
+ formRef,
+ message
+ };
+ },
+};
+</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;
+}
+
+.approval-process {
+ background: #fff;
+ margin: 16px;
+ border-radius: 16px;
+ padding: 16px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
+}
+
+.approval-header {
+ margin-bottom: 16px;
+}
+
+.approval-title {
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+ display: block;
+ margin-bottom: 4px;
+}
+
+.approval-desc {
+ font-size: 12px;
+ color: #999;
+}
+
+.approval-steps {
+ padding-left: 16px;
+ position: relative;
+}
+
+.approval-step {
+ position: relative;
+ margin-bottom: 20px;
+}
+
+.step-title {
+ margin-bottom: 12px;
+}
+
+.step-title text {
+ font-size: 14px;
+ color: #666;
+ background: #f0f0f0;
+ padding: 2px 8px;
+ border-radius: 4px;
+}
+
+.approvers-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ margin-bottom: 8px;
+}
+
+.approver-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 60px;
+}
+
+.approver-avatar {
+ width: 40px;
+ height: 40px;
+ background: #e6f7ff;
+ border-radius: 50%;
+ margin-bottom: 4px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.approver-avatar::after {
+ content: '馃懁';
+ font-size: 20px;
+}
+
+.approver-name {
+ font-size: 12px;
+ color: #333;
+ text-align: center;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-bottom: 2px;
+}
+
+.delete-approver-btn {
+ font-size: 12px;
+ color: #ff4d4f;
+ background: rgba(255, 77, 79, 0.1);
+ width: 16px;
+ height: 16px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 2px;
+}
+
+.delete-step-btn {
+ margin-top: 8px;
+ color: #ff4d4f;
+ font-size: 12px;
+ background: rgba(255, 77, 79, 0.1);
+ padding: 2px 8px;
+ border-radius: 4px;
+ display: inline-block;
+ }
+
+.add-approver-btn {
+ width: 40px;
+ height: 40px;
+ border: 1px dashed #ccc;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 20px;
+ color: #999;
+ margin-top: 8px;
+}
+
+.step-line {
+ position: absolute;
+ left: 20px;
+ top: 100%;
+ width: 1px;
+ height: 30px;
+ background: #e0e0e0;
+}
+
+.add-step-btn {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 16px;
+ color: #006cfb;
+ font-size: 14px;
+ padding: 8px 0;
+ border: 1px dashed #006cfb;
+ border-radius: 8px;
+}
+
+.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>
\ No newline at end of file
diff --git a/src/pages/cooperativeOffice/collaborativeApproval/index.vue b/src/pages/cooperativeOffice/collaborativeApproval/index.vue
new file mode 100644
index 0000000..69dc26d
--- /dev/null
+++ b/src/pages/cooperativeOffice/collaborativeApproval/index.vue
@@ -0,0 +1,390 @@
+// 瀹℃壒绠$悊涓婚〉闈�
+<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">
+ <u-input placeholder="璇疯緭鍏ラ噰璐悎鍚屽彿" class="search-text" v-model="searchKeyword">
+ <template #suffix>
+ <up-icon name="search" size="24" color="#999" @click="getList"></up-icon>
+ </template>
+ </u-input>
+ </view>
+ <view class="filter-button" @click="showFilterOptions">
+ <van-icon name="filter-o" size="24" color="#999"></van-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>
+ <up-divider></up-divider>
+
+ <view class="item-details">
+ <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 highlightBlue">{{ item.entryDate }}</text>
+ </view>
+ </view>
+ <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 highlightYellow">{{ 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/cooperativeOffice/collaborativeApproval";
+
+ // 鎼滅储鍏抽敭璇�
+ 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/cooperativeOffice/collaborativeApproval/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: 4px 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: #ed8d05;
+ 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.highlightBlue {
+ color: #2979ff;
+ font-weight: 500;
+ }
+
+ .detail-value.highlightYellow {
+ color: #ed8d05;
+ 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: #ed8d05;
+ 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>
\ No newline at end of file
diff --git a/src/pages/index.vue b/src/pages/index.vue
index e35f5e3..1e51897 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -293,6 +293,16 @@
url: '/pages/sales/salesAccount/index'
});
break;
+ case '鍗忓悓瀹℃壒':
+ uni.navigateTo({
+ url: '/pages/cooperativeOffice/collaborativeApproval/index'
+ });
+ break;
+ case '瀹㈡埛鎷滆':
+ uni.navigateTo({
+ url: '/pages/cooperativeOffice/clientVisit/index'
+ });
+ break;
default:
uni.showToast({
title: `鐐瑰嚮浜�${item.label}`,
--
Gitblit v1.9.3