| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="ledger-detail"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader :title="operationType === 'edit' ? 'ç¼è¾è®¾å¤å°è´¦' : 'æ°å¢è®¾å¤å°è´¦'" @back="goBack" /> |
| | | |
| | | <!-- 表åå
容 --> |
| | | <van-form @submit="sendForm" ref="formRef" label-width="110px" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> |
| | | <!-- åºæ¬ä¿¡æ¯ --> |
| | | <van-cell-group title="åºæ¬ä¿¡æ¯" inset> |
| | | <van-field |
| | | v-model="form.deviceName" |
| | | label="设å¤åç§°" |
| | | placeholder="请è¾å
¥è®¾å¤åç§°" |
| | | :rules="formRules.deviceName" |
| | | required |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.deviceModel" |
| | | label="è§æ ¼åå·" |
| | | placeholder="请è¾å
¥è§æ ¼åå·" |
| | | :readonly="form.deviceModel != null && operationType === 'edit'" |
| | | :rules="formRules.deviceModel" |
| | | required |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.supplierName" |
| | | label="ä¾åºå" |
| | | required |
| | | placeholder="请è¾å
¥ä¾åºå" |
| | | :rules="formRules.supplierName" |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.unit" |
| | | label="åä½" |
| | | required |
| | | placeholder="请è¾å
¥åä½" |
| | | :rules="formRules.unit" |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.taxRate" |
| | | required |
| | | label="ç¨ç(%)" |
| | | placeholder="è¯·éæ©" |
| | | readonly |
| | | :rules="formRules.taxRate" |
| | | @click="showTaxRatePicker" |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.number" |
| | | label="æ°é" |
| | | required |
| | | type="number" |
| | | placeholder="请è¾å
¥æ°é" |
| | | :rules="formRules.number" |
| | | @blur="mathNum" |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.taxIncludingPriceUnit" |
| | | label="å«ç¨åä»·" |
| | | required |
| | | type="number" |
| | | placeholder="请è¾å
¥å«ç¨åä»·" |
| | | :rules="formRules.taxIncludingPriceUnit" |
| | | @blur="mathNum" |
| | | clearable |
| | | /> |
| | | <van-field |
| | | v-model="form.taxIncludingPriceTotal" |
| | | label="å«ç¨æ»ä»·" |
| | | placeholder="èªå¨çæ" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.unTaxIncludingPriceTotal" |
| | | label="ä¸å«ç¨æ»ä»·" |
| | | placeholder="èªå¨çæ" |
| | | readonly |
| | | /> |
| | | <van-field |
| | | v-model="form.createTime" |
| | | label="å½å
¥æ¥æ" |
| | | placeholder="è¯·éæ©" |
| | | readonly |
| | | @click="showDatePicker" |
| | | required |
| | | clearable |
| | | /> |
| | | </van-cell-group> |
| | | |
| | | <!-- æäº¤æé® --> |
| | | <view class="footer-btns"> |
| | | <van-button class="cancel-btn" @click="goBack">åæ¶</van-button> |
| | | <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">ä¿å</van-button> |
| | | </view> |
| | | </van-form> |
| | | |
| | | <!-- ç¨çéæ©å¨ --> |
| | | <van-popup v-model:show="showTaxRate" position="bottom"> |
| | | <van-picker |
| | | :model-value="taxRatePickerValue" |
| | | :columns="taxRateOptions" |
| | | @confirm="onTaxRateConfirm" |
| | | @cancel="showTaxRate = false" |
| | | /> |
| | | </van-popup> |
| | | |
| | | <!-- æ¥æéæ©å¨ --> |
| | | <van-popup v-model:show="showDate" position="bottom"> |
| | | <van-date-picker |
| | | v-model="currentDate" |
| | | title="éæ©æ¥æ" |
| | | @confirm="onDateConfirm" |
| | | @cancel="showDate = false" |
| | | /> |
| | | </van-popup> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, onMounted } from 'vue'; |
| | | import { onShow } from '@dcloudio/uni-app'; |
| | | import PageHeader from '@/components/PageHeader.vue'; |
| | | import { getLedgerById, addLedger, editLedger } from '@/api/equipmentManagement/ledger'; |
| | | import dayjs from "dayjs"; |
| | | import { |
| | | calculateTaxIncludeTotalPrice, |
| | | calculateTaxExclusiveTotalPrice, |
| | | } from "@/utils/summarizeTable"; |
| | | import { showToast } from 'vant'; |
| | | |
| | | defineOptions({ |
| | | name: "设å¤å°è´¦è¡¨å", |
| | | }); |
| | | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(null); |
| | | const operationType = ref(''); |
| | | const loading = ref(false); |
| | | const showTaxRate = ref(false); |
| | | const taxRatePickerValue = ref([]); |
| | | const showDate = ref(false); |
| | | const currentDate = ref([new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDate()]); |
| | | |
| | | // 表åéªè¯è§å |
| | | const formRules = { |
| | | deviceName: [{ required: true, trigger: "blur", message: "请è¾å
¥" }], |
| | | deviceModel: [{ required: true, trigger: "blur", message: "请è¾å
¥" }], |
| | | supplierName: [{ required: true, trigger: "blur", message: "请è¾å
¥" }], |
| | | unit: [{ required: true, trigger: "blur", message: "请è¾å
¥" }], |
| | | number: [{ required: true, trigger: "blur", message: "请è¾å
¥" }], |
| | | taxIncludingPriceUnit: [{ required: true, trigger: "blur", message: "请è¾å
¥" }], |
| | | taxRate: [{ required: true, trigger: "change", message: "请è¾å
¥" }], |
| | | }; |
| | | |
| | | // ä½¿ç¨ ref 声æè¡¨åæ°æ® |
| | | const form = ref({ |
| | | deviceName: undefined, // 设å¤åç§° |
| | | deviceModel: undefined, // è§æ ¼åå· |
| | | supplierName: undefined, // ä¾åºå |
| | | unit: undefined, // åä½ |
| | | number: undefined, // æ°é |
| | | taxIncludingPriceUnit: undefined, // å«ç¨åä»· |
| | | taxIncludingPriceTotal: undefined, // å«ç¨æ»ä»· |
| | | taxRate: undefined, // ç¨ç |
| | | unTaxIncludingPriceTotal: undefined, // ä¸å«ç¨æ»ä»· |
| | | createTime: dayjs().format("YYYY-MM-DD"), // å½å
¥æ¥æ |
| | | }); |
| | | |
| | | // ç¨çé项 |
| | | const taxRateOptions = computed(() => { |
| | | return [ |
| | | { text: '1', value: 1 }, |
| | | { text: '6', value: 6 }, |
| | | { text: '13', value: 13 } |
| | | ] |
| | | }); |
| | | |
| | | // å è½½è¡¨åæ°æ® |
| | | const loadForm = async (id) => { |
| | | if (id) { |
| | | operationType.value = 'edit'; |
| | | } |
| | | try { |
| | | const { code, data } = await getLedgerById(id); |
| | | if (code == 200) { |
| | | form.value.deviceName = data.deviceName; |
| | | form.value.deviceModel = data.deviceModel; |
| | | form.value.supplierName = data.supplierName; |
| | | form.value.unit = data.unit; |
| | | form.value.number = data.number; |
| | | form.value.taxIncludingPriceUnit = data.taxIncludingPriceUnit; |
| | | form.value.taxIncludingPriceTotal = data.taxIncludingPriceTotal; |
| | | form.value.taxRate = data.taxRate; |
| | | form.value.unTaxIncludingPriceTotal = data.unTaxIncludingPriceTotal; |
| | | form.value.createTime = data.createTime; |
| | | } |
| | | } catch (e) { |
| | | showToast('è·å详æ
失败'); |
| | | } |
| | | }; |
| | | |
| | | // æ°å¦è®¡ç® |
| | | const mathNum = () => { |
| | | if (!form.value.taxIncludingPriceUnit) { |
| | | showToast("请è¾å
¥åä»·"); |
| | | return; |
| | | } |
| | | if (!form.value.number) { |
| | | showToast("请è¾å
¥æ°é"); |
| | | return; |
| | | } |
| | | form.value.taxIncludingPriceTotal = calculateTaxIncludeTotalPrice( |
| | | form.value.taxIncludingPriceUnit, |
| | | form.value.number |
| | | ); |
| | | if (form.value.taxRate) { |
| | | form.value.unTaxIncludingPriceTotal = calculateTaxExclusiveTotalPrice( |
| | | form.value.taxIncludingPriceTotal, |
| | | form.value.taxRate |
| | | ); |
| | | } |
| | | }; |
| | | |
| | | // æ¸
é¤è¡¨åæ ¡éªç¶æ |
| | | const clearValidate = () => { |
| | | formRef.value?.clearValidate(); |
| | | }; |
| | | |
| | | // éç½®è¡¨åæ°æ®åæ ¡éªç¶æ |
| | | const resetForm = () => { |
| | | form.value = { |
| | | deviceName: undefined, |
| | | deviceModel: undefined, |
| | | supplierName: undefined, |
| | | unit: undefined, |
| | | number: undefined, |
| | | taxIncludingPriceUnit: undefined, |
| | | taxIncludingPriceTotal: undefined, |
| | | taxRate: undefined, |
| | | unTaxIncludingPriceTotal: undefined, |
| | | createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), |
| | | }; |
| | | }; |
| | | |
| | | const resetFormAndValidate = () => { |
| | | resetForm(); |
| | | clearValidate(); |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const sendForm = async () => { |
| | | try { |
| | | // æå¨éªè¯è¡¨å |
| | | await formRef.value?.validate(); |
| | | |
| | | loading.value = true; |
| | | const id = getPageId(); |
| | | |
| | | // åå¤æäº¤æ°æ®ï¼createTime å ä¸å½åæ¶åç§ |
| | | const submitData = { ...form.value }; |
| | | if (submitData.createTime && !submitData.createTime.includes(':')) { |
| | | // 妿 createTime åªå
嫿¥æï¼æ·»å å½åæ¶åç§ |
| | | submitData.createTime = submitData.createTime + ' ' + dayjs().format('HH:mm:ss'); |
| | | } |
| | | |
| | | const { code } = id |
| | | ? await editLedger({ id: id, ...submitData }) |
| | | : await addLedger(submitData); |
| | | |
| | | if (code == 200) { |
| | | showToast("æä½æå"); |
| | | setTimeout(() => { |
| | | uni.navigateBack(); |
| | | }, 1500); |
| | | } else { |
| | | loading.value = false; |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | showToast('表åéªè¯å¤±è´¥'); |
| | | } |
| | | }; |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // è·å页é¢åæ° |
| | | const getPageParams = () => { |
| | | const pages = getCurrentPages(); |
| | | const currentPage = pages[pages.length - 1]; |
| | | const options = currentPage.options; |
| | | |
| | | if (options.id) { |
| | | // ç¼è¾æ¨¡å¼ï¼è·å详æ
|
| | | loadForm(options.id); |
| | | } else { |
| | | // æ°å¢æ¨¡å¼ |
| | | operationType.value = 'add'; |
| | | } |
| | | }; |
| | | |
| | | // è·å页é¢ID |
| | | const getPageId = () => { |
| | | const pages = getCurrentPages(); |
| | | const currentPage = pages[pages.length - 1]; |
| | | const options = currentPage.options; |
| | | return options.id; |
| | | }; |
| | | |
| | | // æ¾ç¤ºç¨çéæ©å¨ |
| | | const showTaxRatePicker = () => { |
| | | showTaxRate.value = true; |
| | | }; |
| | | |
| | | // 确认ç¨çéæ© |
| | | const onTaxRateConfirm = ({ selectedValues, selectedOptions }) => { |
| | | form.value.taxRate = selectedOptions[0].value; |
| | | taxRatePickerValue.value = selectedValues; |
| | | showTaxRate.value = false; |
| | | mathNum(); // éæ°è®¡ç® |
| | | }; |
| | | |
| | | // æ¾ç¤ºæ¥æéæ©å¨ |
| | | const showDatePicker = () => { |
| | | showDate.value = true; |
| | | }; |
| | | |
| | | // ç¡®è®¤æ¥æéæ© |
| | | const onDateConfirm = ({ selectedValues }) => { |
| | | // åªä¿åå¹´ææ¥ï¼ä¸å
嫿¶åç§ |
| | | form.value.createTime = selectedValues.join('-'); |
| | | currentDate.value = selectedValues; |
| | | showDate.value = false; |
| | | }; |
| | | |
| | | onShow(() => { |
| | | // 页颿¾ç¤ºæ¶è·ååæ° |
| | | getPageParams(); |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | // 页é¢å è½½æ¶è·ååæ° |
| | | getPageParams(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .ledger-detail { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | padding-bottom: 5rem; |
| | | } |
| | | |
| | | .footer-btns { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: #fff; |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | padding: 0.75rem 0; |
| | | box-shadow: 0 -0.125rem 0.5rem rgba(0,0,0,0.05); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | font-weight: 400; |
| | | font-size: 1rem; |
| | | color: #FFFFFF; |
| | | width: 6.375rem; |
| | | background: #C7C9CC; |
| | | box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2); |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .save-btn { |
| | | font-weight: 400; |
| | | font-size: 1rem; |
| | | color: #FFFFFF; |
| | | width: 14rem; |
| | | background: linear-gradient( 140deg, #00BAFF 0%, #006CFB 100%); |
| | | box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2); |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | // ååºå¼è°æ´ |
| | | @media (max-width: 768px) { |
| | | .submit-section { |
| | | padding: 12px; |
| | | } |
| | | } |
| | | |
| | | .tip-text { |
| | | padding: 4px 16px 0 16px; |
| | | font-size: 12px; |
| | | color: #888; |
| | | } |
| | | </style> |