| | |
| | | <u-form-item label="录入日期" prop="entryDate" border-bottom> |
| | | <u-input v-model="form.entryDate" placeholder="请输入" disabled /> |
| | | </u-form-item> |
| | | <!-- 业务员选择弹窗 --> |
| | | <u-popup v-model="showPicker" mode="bottom"> |
| | | <view class="picker-header"> |
| | | <view class="picker-cancel" @click="showPicker = false">取消</view> |
| | | <view class="picker-title">选择业务员</view> |
| | | <view class="picker-confirm" @click="confirmSalesman">确定</view> |
| | | </view> |
| | | <u-picker |
| | | :columns="userList" |
| | | v-model="pickerValue" |
| | | @confirm="onConfirm" |
| | | @cancel="showPicker = false" |
| | | @change="onPickerChange" |
| | | /> |
| | | </u-popup> |
| | | |
| | | <!-- 客户选择弹窗 --> |
| | | <u-popup v-model="showCustomerPicker" mode="bottom"> |
| | | <view class="picker-header"> |
| | | <view class="picker-cancel" @click="showCustomerPicker = false">取消</view> |
| | | <view class="picker-title">选择客户</view> |
| | | <view class="picker-confirm" @click="confirmCustomer">确定</view> |
| | | </view> |
| | | <u-picker |
| | | :columns="customerOption" |
| | | v-model="pickerCustomerValue" |
| | | @confirm="onCustomerConfirm" |
| | | @cancel="showCustomerPicker = false" |
| | | @change="onCustomerPickerChange" |
| | | /> |
| | | </u-popup> |
| | | |
| | |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="footer-btns" v-if="operationType !== 'view'"> |
| | | <u-button class="cancel-btn" @click="goBack">取消</u-button> |
| | | <u-button class="save-btn" type="primary" @click="onSubmit">保存</u-button> |
| | | </view> |
| | | </u-form> |
| | | |
| | | <!-- 使用公共底部按钮组件 --> |
| | | <FooterButtons |
| | | :show="operationType !== 'view'" |
| | | cancelText="取消" |
| | | confirmText="保存" |
| | | @cancel="goBack" |
| | | @confirm="onSubmit" |
| | | /> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | } from "@/api/salesManagement/salesLedger"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import {calculateTaxExclusiveTotalPrice} from "@/utils/summarizeTable"; |
| | | import PageHeader from '@/components/PageHeader.vue'; |
| | | import FooterButtons from '@/components/FooterButtons.vue'; |
| | | |
| | | // 获取页面参数 |
| | | const operationType = ref(''); |
| | |
| | | const pickerSpecificationValue = ref(['']); |
| | | const pickerTaxRateValue = ref(['']); |
| | | const pickerInvoiceTypeValue = ref(['']); |
| | | |
| | | // 临时存储选择器选中的值 |
| | | const tempSalesmanValue = ref(''); |
| | | const tempCustomerValue = ref(''); |
| | | const selectedSalesman = ref(null); |
| | | const selectedCustomer = ref(null); |
| | | const currentProductIndex = ref(0); |
| | | |
| | | // 选项数据 |
| | |
| | | invoiceType: '' |
| | | }); |
| | | }; |
| | | const onConfirm = ({ selectedValues, selectedOptions }) => { |
| | | form.value.salesman = selectedOptions[0]?.text; |
| | | pickerValue.value = [selectedValues[0]]; |
| | | // 业务员选择器变化事件 |
| | | const onPickerChange = ({ selectedValues, selectedOptions }) => { |
| | | selectedSalesman.value = selectedOptions[0]; |
| | | tempSalesmanValue.value = { |
| | | text: selectedOptions[0]?.text, |
| | | value: selectedOptions[0]?.value |
| | | }; |
| | | }; |
| | | |
| | | // 确认选择业务员 |
| | | const confirmSalesman = () => { |
| | | if (selectedSalesman.value) { |
| | | form.value.salesman = selectedSalesman.value.text; |
| | | pickerValue.value = [selectedSalesman.value.value]; |
| | | } |
| | | showPicker.value = false; |
| | | }; |
| | | |
| | | // 客户选择器变化事件 |
| | | const onCustomerPickerChange = ({ selectedValues, selectedOptions }) => { |
| | | selectedCustomer.value = selectedOptions[0]; |
| | | tempCustomerValue.value = { |
| | | text: selectedOptions[0]?.text, |
| | | value: selectedOptions[0]?.value |
| | | }; |
| | | }; |
| | | |
| | | // 确认选择客户 |
| | | const confirmCustomer = () => { |
| | | if (selectedCustomer.value) { |
| | | form.value.customerName = selectedCustomer.value.text; |
| | | form.value.customerId = selectedCustomer.value.value; |
| | | pickerCustomerValue.value = [selectedCustomer.value.value]; |
| | | } |
| | | showCustomerPicker.value = false; |
| | | }; |
| | | |
| | | // 修改原有的确认方法(保持兼容性) |
| | | const onConfirm = ({ selectedValues, selectedOptions }) => { |
| | | if (selectedOptions && selectedOptions[0]) { |
| | | form.value.salesman = selectedOptions[0].text; |
| | | pickerValue.value = [selectedValues[0]]; |
| | | } |
| | | showPicker.value = false; |
| | | }; |
| | | |
| | | const onCustomerConfirm = ({ selectedValues, selectedOptions }) => { |
| | | form.value.customerName = selectedOptions[0]?.text; |
| | | form.value.customerId = selectedOptions[0]?.value; |
| | | pickerCustomerValue.value = [selectedValues[0]]; |
| | | if (selectedOptions && selectedOptions[0]) { |
| | | form.value.customerName = selectedOptions[0].text; |
| | | form.value.customerId = selectedOptions[0].value; |
| | | pickerCustomerValue.value = [selectedValues[0]]; |
| | | } |
| | | showCustomerPicker.value = false; |
| | | }; |
| | | const onDateConfirm = ({ selectedValues }) => { |
| | |
| | | }; |
| | | const getUserList = () => { |
| | | userListNoPage().then((res) => { |
| | | // 将用户数据组装成 picker 需要的格式 |
| | | userList.value = res.data.map(user => ({ |
| | | // 确保数据格式正确 |
| | | userList.value = [res.data.map(user => ({ |
| | | text: user.nickName, |
| | | value: user.nickName |
| | | })); |
| | | }))]; |
| | | }) |
| | | } |
| | | const getCustomerList = () => { |
| | | customerList().then((res) => { |
| | | // 将用户数据组装成 picker 需要的格式 |
| | | customerOption.value = res.map(item => ({ |
| | | // 确保数据格式正确 |
| | | customerOption.value = [res.map(item => ({ |
| | | text: item.customerName, |
| | | value: item.id |
| | | })); |
| | | }))]; |
| | | }) |
| | | } |
| | | const convertIdToValue = (data) => { |
| | |
| | | background: #f8f9fa; |
| | | padding-bottom: 5rem; |
| | | } |
| | | |
| | | .header { |
| | | display: flex; |
| | | align-items: center; |
| | |
| | | /* 兼容 iOS 刘海/灵动岛安全区 */ |
| | | padding-top: env(safe-area-inset-top); |
| | | } |
| | | |
| | | .title { |
| | | flex: 1; |
| | | text-align: center; |
| | |
| | | font-weight: 600; |
| | | color: #333; |
| | | } |
| | | |
| | | .form-section { |
| | | margin-top: 1rem; |
| | | } |
| | |
| | | padding: 1rem; |
| | | box-shadow: 0 0.125rem 0.5rem rgba(0,0,0,0.04); |
| | | } |
| | | |
| | | .section-header { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | margin-bottom: 1rem; |
| | | } |
| | | |
| | | .section-title { |
| | | font-size: 1rem; |
| | | font-weight: 600; |
| | | color: #333; |
| | | } |
| | | |
| | | .product-card { |
| | | background: #FFFFFF; |
| | | box-shadow: 0 0 1.25rem 0 rgba(0,57,117,0.08); |
| | |
| | | padding: 1rem 0.5rem 0 0.5rem; |
| | | position: relative; |
| | | } |
| | | |
| | | .product-header { |
| | | display: flex; |
| | | align-items: center; |
| | |
| | | padding: 0 0.5rem 0.75rem 0.5rem; |
| | | border-bottom: 0.0625rem solid #e8e8e8; |
| | | } |
| | | |
| | | .product-productCategory { |
| | | margin-left: 0.5rem; |
| | | font-size: 0.875rem; |
| | | font-weight: 500; |
| | | color: #333; |
| | | } |
| | | |
| | | .info-grid { |
| | | display: grid; |
| | | grid-template-columns: 1fr 1fr; |
| | | gap: 0.75rem; |
| | | margin-bottom: 1rem; |
| | | } |
| | | |
| | | .info-item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 0.25rem; |
| | | } |
| | | |
| | | .info-label { |
| | | font-size: 0.75rem; |
| | | color: #666; |
| | | font-weight: 400; |
| | | } |
| | | |
| | | .info-value { |
| | | font-size: 0.875rem; |
| | | color: #333; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .info-value.highlight { |
| | | color: #2979ff; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .product-form { |
| | | margin-bottom: 1rem; |
| | | } |
| | | .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; |
| | | } |
| | | |
| | | .popup-header { |
| | |
| | | top: 0; |
| | | z-index: 10; |
| | | } |
| | | |
| | | .cancelButton { |
| | | color: #969799 |
| | | } |
| | | |
| | | .confirmButton { |
| | | color: #1989FA |
| | | } |
| | | |
| | | .u-tree { |
| | | height: 13rem; |
| | | } |
| | | |
| | | /* 移除 input 边框的样式 */ |
| | | :deep(.u-input) { |
| | | border: none !important; |
| | | box-shadow: none !important; |
| | | background: transparent !important; |
| | | } |
| | | |
| | | :deep(.u-input__content) { |
| | | border: none !important; |
| | | box-shadow: none !important; |
| | | background: transparent !important; |
| | | } |
| | | |
| | | :deep(.u-input__content__field-wrapper) { |
| | | border: none !important; |
| | | box-shadow: none !important; |
| | | background: transparent !important; |
| | | } |
| | | |
| | | :deep(.u-input__content__field-wrapper__field) { |
| | | border: none !important; |
| | | box-shadow: none !important; |
| | | background: transparent !important; |
| | | outline: none !important; |
| | | } |
| | | |
| | | /* 移除 textarea 边框的样式 */ |
| | | :deep(.u-textarea) { |
| | | border: none !important; |
| | | box-shadow: none !important; |
| | | background: transparent !important; |
| | | } |
| | | |
| | | :deep(.u-textarea__content) { |
| | | border: none !important; |
| | | box-shadow: none !important; |
| | | background: transparent !important; |
| | | } |
| | | |
| | | :deep(.u-textarea__content__field) { |
| | | border: none !important; |
| | | box-shadow: none !important; |
| | | background: transparent !important; |
| | | outline: none !important; |
| | | } |
| | | |
| | | /* 移除 form-item 的边框 */ |
| | | :deep(.u-form-item) { |
| | | border: none !important; |
| | | } |
| | | |
| | | :deep(.u-form-item__body) { |
| | | border: none !important; |
| | | } |
| | | |
| | | /* 保持分割线样式 */ |
| | | :deep(.u-form-item--border-bottom) { |
| | | border-bottom: 1px solid #ebeef5 !important; |
| | | } |
| | | |
| | | /* 选择器头部样式 */ |
| | | .picker-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 15px 20px; |
| | | background: #fff; |
| | | border-bottom: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .picker-cancel { |
| | | color: #909399; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .picker-title { |
| | | color: #303133; |
| | | font-size: 16px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .picker-confirm { |
| | | color: #2979ff; |
| | | font-size: 16px; |
| | | } |
| | | </style> |