| | |
| | | size="small" |
| | | @click="addProduct" |
| | | class="add-btn" |
| | | v-if="operationType !== 'view'"> |
| | | v-if="canEditProducts"> |
| | | 新增 |
| | | </up-button> |
| | | </view> |
| | |
| | | </view> |
| | | <!-- 操作按钮 --> |
| | | <view class="product-actions" |
| | | v-if="operationType !== 'view'"> |
| | | v-if="canEditProducts"> |
| | | <up-button type="error" |
| | | size="mini" |
| | | @click="removeProduct(idx)" |
| | |
| | | <up-input v-model="product.productCategory" |
| | | readonly |
| | | placeholder="请选择" |
| | | :disabled="!canEditProducts" |
| | | @click="openCategoryPicker(idx)" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | v-if="canEditProducts" |
| | | @click="showCategoryPicker = true"></up-icon> |
| | | </template> |
| | | </up-form-item> |
| | |
| | | <up-input v-model="product.specificationModel" |
| | | readonly |
| | | placeholder="请选择" |
| | | :disabled="!canEditProducts" |
| | | @click="openSpecificationPicker(idx)" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | v-if="canEditProducts" |
| | | @click="showSpecificationPicker = true"></up-icon> |
| | | </template> |
| | | </up-form-item> |
| | |
| | | required |
| | | :rules="productRules"> |
| | | <up-input v-model="product.unit" |
| | | :disabled="!canEditProducts" |
| | | placeholder="请输入" /> |
| | | </up-form-item> |
| | | <!-- 税率 --> |
| | |
| | | <up-input v-model="product.taxRate" |
| | | readonly |
| | | placeholder="请选择" |
| | | :disabled="!canEditProducts" |
| | | @click="openTaxRatePicker(idx)" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | v-if="canEditProducts" |
| | | @click="showTaxRatePicker = true"></up-icon> |
| | | </template> |
| | | </up-form-item> |
| | |
| | | :rules="productRules"> |
| | | <up-input v-model="product.taxInclusiveUnitPrice" |
| | | type="number" |
| | | :disabled="!canEditProducts" |
| | | placeholder="请输入" |
| | | @blur="formatTaxPrice(idx)" /> |
| | | </up-form-item> |
| | |
| | | :rules="productRules"> |
| | | <up-input v-model="product.quantity" |
| | | type="number" |
| | | :disabled="!canEditProducts" |
| | | placeholder="请输入" |
| | | @blur="formatAmount(idx)" /> |
| | | </up-form-item> |
| | |
| | | :rules="productRules"> |
| | | <up-input v-model="product.taxInclusiveTotalPrice" |
| | | type="number" |
| | | :disabled="!canEditProducts" |
| | | placeholder="请输入" |
| | | @blur="formatTaxTotal(idx)" /> |
| | | </up-form-item> |
| | |
| | | :rules="productRules"> |
| | | <up-input v-model="product.taxExclusiveTotalPrice" |
| | | type="number" |
| | | :disabled="!canEditProducts" |
| | | placeholder="请输入" |
| | | @blur="formatNoTaxTotal(idx)" /> |
| | | </up-form-item> |
| | |
| | | <up-input v-model="product.invoiceType" |
| | | readonly |
| | | placeholder="请选择" |
| | | :disabled="!canEditProducts" |
| | | @click="openInvoiceTypePicker(idx)" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | v-if="canEditProducts" |
| | | @click="showInvoiceTypePicker = true"></up-icon> |
| | | </template> |
| | | </up-form-item> |
| | |
| | | :rules="productRules"> |
| | | <up-input v-model="product.warnNum" |
| | | type="number" |
| | | :disabled="!canEditProducts" |
| | | placeholder="请输入" /> |
| | | </up-form-item> |
| | | <up-form-item label="是否质检" |
| | |
| | | required |
| | | :rules="productRules"> |
| | | <u-radio-group v-model="product.isChecked" |
| | | :disabled="!canEditProducts" |
| | | placement="row" |
| | | @change="groupChange"> |
| | | <u-radio :customStyle="{marginRight: '40rpx'}" |
| | | label="是" |
| | | :disabled="!canEditProducts" |
| | | :name="true"> |
| | | </u-radio> |
| | | <u-radio label="否" |
| | | :disabled="!canEditProducts" |
| | | :name="false"> |
| | | </u-radio> |
| | | </u-radio-group> |
| | |
| | | </view> |
| | | </view> |
| | | <!-- 使用公共底部按钮组件 --> |
| | | <FooterButtons :show="operationType !== 'view'" |
| | | <FooterButtons :show="operationType !== 'view' && !isApprovalPassed" |
| | | cancelText="取消" |
| | | confirmText="保存" |
| | | @cancel="goBack" |
| | |
| | | getSalesNo, |
| | | approveProcessGetInfo, |
| | | } from "@/api/procurementManagement/procurementLedger"; |
| | | import { delProduct } from "@/api/salesManagement/salesLedger"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import FooterButtons from "@/components/FooterButtons.vue"; |
| | | import { userListNoPageByTenantId } from "@/api/system/user"; |
| | |
| | | const operationType = ref(""); |
| | | const editData = ref(null); |
| | | const formRef = ref(null); |
| | | // 审批通过(approvalStatus === 3)后,禁止编辑/删除产品 |
| | | const isApprovalPassed = computed(() => { |
| | | const status = editData.value?.approvalStatus ?? form.value?.approvalStatus; |
| | | return Number(status) === 3; |
| | | }); |
| | | const canEditProducts = computed(() => { |
| | | return operationType.value !== "view" && !isApprovalPassed.value; |
| | | }); |
| | | |
| | | const userStore = useUserStore(); |
| | | const form = ref({ |
| | |
| | | })); |
| | | }); |
| | | |
| | | // 计算供应商选择列表 |
| | | // 计算供应商选择列表(只保留 isWhite === 0 的供应商) |
| | | const supplierActionList = computed(() => { |
| | | return supplierList.value.map(item => ({ |
| | | name: item.text, |
| | | value: item.value, |
| | | })); |
| | | return supplierList.value |
| | | .filter(item => item.isWhite === 0) |
| | | .map(item => ({ |
| | | name: item.text, |
| | | value: item.value, |
| | | })); |
| | | }); |
| | | |
| | | // 选择器相关变量 |
| | |
| | | }; |
| | | |
| | | const addProduct = () => { |
| | | if (!canEditProducts.value) return; |
| | | if (productData.value === null) { |
| | | productData.value = []; |
| | | } |
| | |
| | | }; |
| | | |
| | | const removeProduct = idx => { |
| | | productData.value.splice(idx, 1); |
| | | if (!canEditProducts.value) return; |
| | | const row = productData.value[idx]; |
| | | |
| | | // 新增模式或还未落库的产品,直接前端删除 |
| | | if (operationType.value === "add" || !row?.id) { |
| | | productData.value.splice(idx, 1); |
| | | return; |
| | | } |
| | | |
| | | uni.showModal({ |
| | | title: "提示", |
| | | content: "选中的产品将被删除,是否确认删除?", |
| | | confirmText: "确认", |
| | | cancelText: "取消", |
| | | success: res => { |
| | | if (!res.confirm) { |
| | | uni.showToast({ |
| | | title: "已取消", |
| | | icon: "none", |
| | | }); |
| | | return; |
| | | } |
| | | const ids = [row.id]; |
| | | delProduct(ids).then(() => { |
| | | uni.showToast({ |
| | | title: "删除成功", |
| | | icon: "success", |
| | | }); |
| | | const currentId = form.value.id || editData.value?.id; |
| | | if (currentId) { |
| | | getPurchaseById({ id: currentId, type: 2 }).then(res2 => { |
| | | productData.value = res2.productData || []; |
| | | }); |
| | | } else { |
| | | // 回退处理:如果没有当前ID,则本地删除 |
| | | productData.value.splice(idx, 1); |
| | | } |
| | | }); |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | // 显示选择器 |
| | | const openCategoryPicker = idx => { |
| | | if (!canEditProducts.value) return; |
| | | currentProductIndex.value = idx; |
| | | showCategoryPicker.value = true; |
| | | }; |
| | | |
| | | const openSpecificationPicker = idx => { |
| | | if (!canEditProducts.value) return; |
| | | currentProductIndex.value = idx; |
| | | showSpecificationPicker.value = true; |
| | | }; |
| | | |
| | | const openTaxRatePicker = idx => { |
| | | if (!canEditProducts.value) return; |
| | | currentProductIndex.value = idx; |
| | | showTaxRatePicker.value = true; |
| | | }; |
| | | |
| | | const openInvoiceTypePicker = idx => { |
| | | if (!canEditProducts.value) return; |
| | | currentProductIndex.value = idx; |
| | | showInvoiceTypePicker.value = true; |
| | | }; |
| | |
| | | supplierList.value = res.data.map(item => ({ |
| | | text: item.supplierName, |
| | | value: item.id, |
| | | isWhite: item.isWhite, |
| | | })); |
| | | }); |
| | | }; |