ZN
7 天以前 dd630fede0cc46500fe898c75464e3e04ce82b0f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<template>
  <view class="sales-account">
    <PageHeader :title="pageTitle" @back="goBack" />
    <view class="search-section">
      <up-form :model="form" :rules="rules" ref="formRef">
        <up-form-item label="支出日期" prop="expenseDate">
          <uni-datetime-picker type="date" v-model="form.expenseDate" />
        </up-form-item>
        <up-form-item label="支出类型" prop="expenseType">
          <up-picker :columns="[expenseTypes]" key-name="label" v-model="expenseTypeIndex" @confirm="onExpenseTypeConfirm" />
        </up-form-item>
        <up-form-item label="供应商名称" prop="supplierName">
          <up-input v-model="form.supplierName" placeholder="请输入" />
        </up-form-item>
        <up-form-item label="支出金额" prop="expenseMoney">
          <up-input type="number" v-model="form.expenseMoney" placeholder="请输入" />
        </up-form-item>
        <up-form-item label="支出描述" prop="expenseDescribed">
          <up-input v-model="form.expenseDescribed" placeholder="请输入" />
        </up-form-item>
        <up-form-item label="付款方式" prop="expenseMethod">
          <up-picker :columns="[checkoutPayment]" key-name="label" v-model="expenseMethodIndex" @confirm="onMethodConfirm" />
        </up-form-item>
        <up-form-item label="发票号码" prop="invoiceNumber">
          <up-input v-model="form.invoiceNumber" placeholder="请输入" />
        </up-form-item>
        <up-form-item label="备注" prop="note">
          <up-textarea v-model="form.note" placeholder="请输入" autoHeight />
        </up-form-item>
      </up-form>
      <view class="actions">
        <u-button type="primary" @click="submitForm">保存</u-button>
      </view>
    </view>
  </view>
</template>
 
<script setup>
import { ref, reactive, computed } from "vue";
import { onLoad } from "@dcloudio/uni-app";
import { useDict } from "@/utils/dict";
import { add, update, getAccountExpense } from "@/api/financialManagement/expenseManagement";
 
const operationType = ref("add");
const id = ref(undefined);
 
const { checkout_payment, expense_types } = useDict("checkout_payment", "expense_types");
const checkoutPayment = ref([]);
const expenseTypes = ref([]);
const expenseTypeIndex = ref([0]);
const expenseMethodIndex = ref([0]);
 
const formRef = ref();
const form = reactive({
  expenseDate: undefined,
  expenseType: undefined,
  supplierName: "",
  expenseMoney: undefined,
  expenseDescribed: "",
  expenseMethod: undefined,
  invoiceNumber: "",
  note: "",
});
 
const rules = {
  expenseDate: [{ required: true, message: "请选择", trigger: "change" }],
  expenseType: [{ required: true, message: "请选择", trigger: "change" }],
  supplierName: [{ required: true, message: "请输入", trigger: "blur" }],
  expenseMoney: [{ required: true, message: "请输入", trigger: "blur" }],
  expenseDescribed: [{ required: true, message: "请输入", trigger: "blur" }],
  expenseMethod: [{ required: true, message: "请选择", trigger: "change" }],
};
 
const pageTitle = computed(() => (operationType.value === "edit" ? "编辑支出" : "新增支出"));
 
const onExpenseTypeConfirm = (e) => {
  const item = expenseTypes.value[e.value[0]];
  if (item) form.expenseType = item.value;
};
const onMethodConfirm = (e) => {
  const item = checkoutPayment.value[e.value[0]];
  if (item) form.expenseMethod = item.value;
};
 
const syncDict = () => {
  checkoutPayment.value = (checkout_payment?.value || []).map(i => ({ label: i.label, value: i.value }));
  expenseTypes.value = (expense_types?.value || []).map(i => ({ label: i.label, value: i.value }));
};
 
const submitForm = () => {
  formRef.value?.validate(async (valid) => {
    if (!valid) return;
    const payload = { ...form };
    const res = operationType.value === "edit" ? await update({ id: id.value, ...payload }) : await add(payload);
    if (res?.code === 200) {
      uni.navigateBack();
    }
  });
};
 
const goBack = () => {
  uni.navigateBack();
};
 
onLoad(async (query) => {
  syncDict();
  operationType.value = query?.type || "add";
  if (query?.id) {
    id.value = query.id;
    const res = await getAccountExpense(id.value);
    const data = res?.data ?? res;
    Object.assign(form, data || {});
  }
});
</script>
 
<style scoped lang="scss">
@import "@/styles/sales-common.scss";
.actions { margin-top: 16px; }
</style>