| | |
| | | :value="2" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="订单状态:"> |
| | | <el-select v-model="searchForm.orderStatus" |
| | | placeholder="请选择" |
| | | clearable |
| | | style="width: 140px"> |
| | | <el-option label="进行中" |
| | | :value="0" /> |
| | | <el-option label="已完成" |
| | | :value="1" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" |
| | | @click="handleQuery"> 搜索 </el-button> |
| | |
| | | <el-button type="primary" |
| | | @click="handleReverseAudit" |
| | | :disabled="isBatchButtonDisabled('reverseAudit')">反审</el-button> |
| | | <el-button type="warning" |
| | | @click="handleMarkCompleted" |
| | | :disabled="isBatchButtonDisabled('markCompleted')">标记完成</el-button> |
| | | <el-button type="primary" |
| | | @click="handleSalesStock" |
| | | :disabled="isBatchButtonDisabled('stock')">入库</el-button> |
| | |
| | | type="info">-</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="订单状态" |
| | | width="120" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <el-tag v-if="Number(scope.row.orderStatus) === 1" |
| | | type="success">已完成</el-tag> |
| | | <el-tag v-else |
| | | type="info">进行中</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="标签打印" |
| | | width="90" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.labelPrintCount ?? 0 }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="单据打印" |
| | | width="90" |
| | | align="center"> |
| | | <template #default="scope"> |
| | | <span>{{ scope.row.documentPrintCount ?? 0 }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="录入人" |
| | | prop="entryPersonName" |
| | | width="100" |
| | |
| | | <el-button link |
| | | type="primary" |
| | | @click="openForm('edit', scope.row)" |
| | | :disabled="Number(scope.row.reviewStatus) === 1">编辑</el-button> |
| | | :disabled="Number(scope.row.orderStatus) === 1">编辑</el-button> |
| | | <el-button link |
| | | type="primary" |
| | | @click="openProcessFlowSelect(scope.row)" |
| | | :disabled="Number(scope.row.reviewStatus) !== 1">工艺路线</el-button> |
| | | :disabled="Number(scope.row.reviewStatus) !== 1 || Number(scope.row.orderStatus) === 1">工艺路线</el-button> |
| | | <el-button link |
| | | type="primary" |
| | | @click="downLoadFile(scope.row)">附件</el-button> |
| | | <el-button link |
| | | type="primary" |
| | | @click="openLedgerQrDialog(scope.row)">二维码</el-button> |
| | | @click="openLedgerQrDialog(scope.row)" |
| | | :disabled="Number(scope.row.orderStatus) === 1">二维码</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | @pagination="paginationChange" /> |
| | | </div> |
| | | <FormDialog v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? '新增销售台账页面' : '编辑销售台账页面'" |
| | | :title="isCompletedOrder ? '查看销售台账页面(已完成)' : operationType === 'add' ? '新增销售台账页面' : '编辑销售台账页面'" |
| | | :width="'70%'" |
| | | :operation-type="operationType" |
| | | :operation-type="isCompletedOrder ? 'detail' : operationType" |
| | | @close="closeDia" |
| | | @confirm="submitForm" |
| | | @cancel="closeDia"> |
| | |
| | | <el-select v-model="form.salesman" |
| | | placeholder="请选择" |
| | | clearable |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1"> |
| | | :disabled="operationType === 'view' || isReviewedEdit"> |
| | | <el-option v-for="item in userList" |
| | | :key="item.nickName" |
| | | :label="item.nickName" |
| | |
| | | filterable |
| | | placeholder="请选择" |
| | | clearable |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1"> |
| | | :disabled="operationType === 'view' || isReviewedEdit"> |
| | | <el-option v-for="item in customerOption" |
| | | :key="item.id" |
| | | :label="item.customerName" |
| | |
| | | <el-input v-model="form.projectName" |
| | | placeholder="请输入" |
| | | clearable |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" /> |
| | | :disabled="operationType === 'view' || isReviewedEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | type="date" |
| | | placeholder="请选择" |
| | | clearable |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" /> |
| | | :disabled="operationType === 'view' || isReviewedEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | type="date" |
| | | placeholder="请选择" |
| | | clearable |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" /> |
| | | :disabled="operationType === 'view' || isReviewedEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | placeholder="请选择" |
| | | clearable |
| | | @change="changs" |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1"> |
| | | :disabled="operationType === 'view' || isReviewedEdit"> |
| | | <el-option v-for="item in userList" |
| | | :key="item.userId" |
| | | :label="item.nickName" |
| | |
| | | type="date" |
| | | placeholder="请选择" |
| | | clearable |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" /> |
| | | :disabled="operationType === 'view' || isReviewedEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | prop="entryDate"> |
| | | <el-button v-if="operationType !== 'view'" |
| | | type="primary" |
| | | :disabled="hasEditingProductRow() || Number(form.reviewStatus) === 1" |
| | | :disabled="hasEditingProductRow() || isReviewedEdit" |
| | | @click="addProductInline"> |
| | | 添加 |
| | | </el-button> |
| | | <el-button v-if="operationType !== 'view'" |
| | | plain |
| | | type="danger" |
| | | :disabled="Number(form.reviewStatus) === 1" |
| | | :disabled="isReviewedEdit" |
| | | @click="deleteProduct">删除</el-button> |
| | | </el-form-item> |
| | | </el-row> |
| | |
| | | style="width: 100%" |
| | | :filter-node-method="filterProductCategoryNode" |
| | | @change="(val) => handleInlineProductCategoryChange(scope.row, val)" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.productCategory ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | filterable |
| | | style="width: 100%" |
| | | @change="(val) => handleInlineProductModelChange(scope.row, val)" |
| | | :disabled="Number(form.reviewStatus) === 1"> |
| | | :disabled="isReviewedEdit"> |
| | | <el-option v-for="item in modelOptions" |
| | | :key="item.id" |
| | | :label="item.model" |
| | |
| | | style="width: 100%" |
| | | placeholder="请输入" |
| | | clearable |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.thickness ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | placeholder="请输入" |
| | | clearable |
| | | style="width: 100%" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.floorCode ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | clearable |
| | | @change="() => handleInlineSizeChange(scope.row)" |
| | | @input="() => handleInlineSizeChange(scope.row)" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.width ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | clearable |
| | | @change="() => handleInlineSizeChange(scope.row)" |
| | | @input="() => handleInlineSizeChange(scope.row)" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.height ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | clearable |
| | | @change="() => handleInlineQuantityChange(scope.row)" |
| | | @input="() => handleInlineQuantityChange(scope.row)" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.quantity ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | placeholder="请输入" |
| | | clearable |
| | | @change="() => handleInlineSettleAreaChange(scope.row)" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.settlePieceArea ? Number(scope.row.settlePieceArea).toFixed(4) : "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | :precision="4" |
| | | style="width: 100%" |
| | | placeholder="自动计算" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.actualTotalArea ? Number(scope.row.actualTotalArea).toFixed(4) : "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | clearable |
| | | style="width: 100%" |
| | | @change="() => handleInlineTaxRateChange(scope.row)" |
| | | :disabled="Number(form.reviewStatus) === 1"> |
| | | :disabled="isReviewedEdit"> |
| | | <el-option label="1" |
| | | value="1" /> |
| | | <el-option label="3" |
| | |
| | | placeholder="请输入" |
| | | clearable |
| | | style="width: 100%" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.processRequirement ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | placeholder="请选择" |
| | | clearable |
| | | style="width: 100%" |
| | | :disabled="Number(form.reviewStatus) === 1"> |
| | | :disabled="isReviewedEdit"> |
| | | <el-option label="增普票" |
| | | value="增普票" /> |
| | | <el-option label="增专票" |
| | |
| | | placeholder="请输入" |
| | | clearable |
| | | style="width: 100%" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.remark ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | placeholder="请输入" |
| | | clearable |
| | | style="width: 100%" |
| | | :disabled="Number(form.reviewStatus) === 1" /> |
| | | :disabled="isReviewedEdit" /> |
| | | <span v-else>{{ scope.row.heavyBox ?? "" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | </el-popover> |
| | | </template> |
| | | <template v-else> |
| | | <el-button link |
| | | <!-- 已审核模式:只能修改单价 --> |
| | | <el-button v-if="isReviewedEdit" |
| | | link |
| | | type="primary" |
| | | size="small" |
| | | :disabled="isProductShipped(scope.row)" |
| | | @click="editProductInline(scope.row, scope.$index)"> |
| | | 编辑 |
| | | @click="editPriceOnly(scope.row)"> |
| | | 修改单价 |
| | | </el-button> |
| | | <el-button link |
| | | type="primary" |
| | | size="small" |
| | | :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1" |
| | | @click="copyProductInline(scope.row, scope.$index)"> |
| | | 复制新建 |
| | | </el-button> |
| | | <!-- 未审核模式:完整编辑 --> |
| | | <template v-if="!isReviewedEdit"> |
| | | <el-button link |
| | | type="primary" |
| | | size="small" |
| | | :disabled="isProductShipped(scope.row)" |
| | | @click="editProductInline(scope.row, scope.$index)"> |
| | | 编辑 |
| | | </el-button> |
| | | <el-button link |
| | | type="primary" |
| | | size="small" |
| | | :disabled="isProductShipped(scope.row)" |
| | | @click="copyProductInline(scope.row, scope.$index)"> |
| | | 复制新建 |
| | | </el-button> |
| | | </template> |
| | | <el-popover :width="560" |
| | | trigger="click" |
| | | :hide-after="0" |
| | |
| | | <el-button type="primary" |
| | | plain |
| | | size="small" |
| | | :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1" |
| | | :disabled="isProductShipped(scope.row) || isReviewedEdit" |
| | | @click="startAddOtherAmountForRow(scope.row)"> |
| | | 新增 |
| | | </el-button> |
| | |
| | | clearable |
| | | placeholder="请选择额外加工项目" |
| | | style="width: 100%;" |
| | | :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1"> |
| | | :disabled="isProductShipped(scope.row) || isReviewedEdit"> |
| | | <el-option v-for="item in otherAmountSelectOptions" |
| | | :key="item.id" |
| | | :label="item.processName" |
| | |
| | | </el-select> |
| | | <div style="display:flex; justify-content:flex-end; gap: 8px;"> |
| | | <el-button size="small" |
| | | :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1" |
| | | :disabled="isProductShipped(scope.row) || isReviewedEdit" |
| | | @click="scope.row.__inlineOtherAmountAdding = false; scope.row.__inlineOtherAmountAddId = null"> |
| | | 取消 |
| | | </el-button> |
| | | <el-button type="primary" |
| | | size="small" |
| | | :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1 || scope.row.__inlineOtherAmountAddId === null || scope.row.__inlineOtherAmountAddId === undefined || scope.row.__inlineOtherAmountAddId === ''" |
| | | :disabled="isProductShipped(scope.row) || isReviewedEdit || scope.row.__inlineOtherAmountAddId === null || scope.row.__inlineOtherAmountAddId === undefined || scope.row.__inlineOtherAmountAddId === ''" |
| | | @click="confirmAddOtherAmountForRow(scope.row)"> |
| | | 确认添加 |
| | | </el-button> |
| | |
| | | :precision="0" |
| | | style="width: 120px;" |
| | | placeholder="数量" |
| | | :disabled="operationType === 'view' || isProductShipped(scope.row) || Number(form.reviewStatus) === 1" |
| | | :disabled="operationType === 'view' || isProductShipped(scope.row) || isReviewedEdit" |
| | | @change="handleOtherAmountQuantityChange(scope.row)" /> |
| | | <el-button type="danger" |
| | | link |
| | | size="small" |
| | | :disabled="isProductShipped(scope.row) || Number(form.reviewStatus) === 1" |
| | | :disabled="isProductShipped(scope.row) || isReviewedEdit" |
| | | @click="removeOtherAmountAtForRow(scope.row, idx)"> |
| | | 删除 |
| | | </el-button> |
| | |
| | | clearable |
| | | type="textarea" |
| | | :rows="2" |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" /> |
| | | :disabled="operationType === 'view' || isReviewedEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | clearable |
| | | type="textarea" |
| | | :rows="2" |
| | | :disabled="operationType === 'view' || Number(form.reviewStatus) === 1" /> |
| | | :disabled="operationType === 'view' || isReviewedEdit" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | :on-success="handleUploadSuccess" |
| | | :on-remove="handleRemove"> |
| | | <el-button type="primary" |
| | | v-if="operationType !== 'view'">上传</el-button> |
| | | v-if="operationType !== 'view' || isCompletedOrder">上传</el-button> |
| | | <template #tip |
| | | v-if="operationType !== 'view'"> |
| | | v-if="operationType !== 'view' || isCompletedOrder"> |
| | | <div class="el-upload__tip"> |
| | | 文件格式支持 |
| | | doc,docx,xls,xlsx,ppt,pptx,pdf,txt,xml,jpg,jpeg,png,gif,bmp,rar,zip,7z |
| | |
| | | </el-dialog> |
| | | <!-- 反审核弹窗 --> |
| | | <el-dialog v-model="reverseAuditDialogVisible" |
| | | title="反审核" |
| | | width="450px" |
| | | :close-on-click-modal="false"> |
| | | <el-form label-width="100px"> |
| | | title="反审核确认" |
| | | width="500px" |
| | | :close-on-click-modal="false" |
| | | class="reverse-audit-dialog"> |
| | | <el-form label-width="110px" |
| | | label-position="left"> |
| | | <el-form-item label="反审核类型"> |
| | | <el-radio-group v-model="reverseAuditForm.counterReviewType"> |
| | | <el-radio :label="1">作废</el-radio> |
| | | <el-radio :label="2">重新生成</el-radio> |
| | | <el-radio :label="1"> |
| | | <span>作废订单</span> |
| | | <span style="color: #909399; font-size: 12px; margin-left: 4px;">(不生成新订单)</span> |
| | | </el-radio> |
| | | <el-radio :label="2"> |
| | | <span>重新生成</span> |
| | | <span style="color: #909399; font-size: 12px; margin-left: 4px;">(跳转到新增页面编辑)</span> |
| | | </el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="反审核描述"> |
| | | <el-form-item label="反审核原因"> |
| | | <el-input v-model="reverseAuditForm.counterReviewDesc" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请输入反审核描述" /> |
| | | :rows="4" |
| | | placeholder="请输入反审核原因" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="reverse-audit-warning"> |
| | | <el-icon style="color: #E6A23C; margin-right: 4px;"><WarningFilled /></el-icon> |
| | | 注意:反审核将自动作废该订单对应的所有入库、出库、发货单据 |
| | | </div> |
| | | <template #footer> |
| | | <el-button @click="reverseAuditDialogVisible = false">取消</el-button> |
| | | <el-button type="primary" |
| | | <el-button type="danger" |
| | | @click="confirmReverseAudit" |
| | | :disabled="!reverseAuditForm.counterReviewType || !reverseAuditForm.counterReviewDesc">确定</el-button> |
| | | :disabled="!reverseAuditForm.counterReviewType || !reverseAuditForm.counterReviewDesc.trim()">确认反审核</el-button> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | |
| | | import { onMounted, ref, reactive, getCurrentInstance, watch, nextTick } from "vue"; |
| | | import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js"; |
| | | import { ElMessageBox, ElMessage } from "element-plus"; |
| | | import { ArrowDown } from "@element-plus/icons-vue"; |
| | | import { ArrowDown, WarningFilled } from "@element-plus/icons-vue"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { approveUserList } from "@/api/collaborativeApproval/approvalProcess.js"; |
| | | import { userListNoPage } from "@/api/system/user.js"; |
| | |
| | | getSalesLabel, |
| | | salesStock, |
| | | counterReview, |
| | | markOrderCompleted, |
| | | incrementPrintCount, |
| | | } from "@/api/salesManagement/salesLedger.js"; |
| | | import { modelList, productTreeList } from "@/api/basicData/product.js"; |
| | | import useFormData from "@/hooks/useFormData.js"; |
| | |
| | | // 用户信息表单弹框数据 |
| | | const operationType = ref(""); |
| | | const dialogFormVisible = ref(false); |
| | | // 已完成订单标记:view 模式但附件上传仍可用 |
| | | const isCompletedOrder = ref(false); |
| | | // 已审核订单编辑模式:只能修改单价,其他字段禁用 |
| | | const isReviewedEdit = ref(false); |
| | | const data = reactive({ |
| | | searchForm: { |
| | | customerName: "", // 客户名称 |
| | |
| | | deliveryStatus: undefined, // 发货状态:1未发货 2审批中 3审批不通过 4审批通过 5已发货 6部分发货 |
| | | stockStatus: undefined, // 入库状态:0未入库 1部分入库 2已入库 |
| | | reviewStatus: undefined, // 审核状态:0待审核 1已审核 2已反审 |
| | | orderStatus: undefined, // 订单状态:0进行中 1已完成 |
| | | }, |
| | | form: { |
| | | salesContractNo: "", |
| | |
| | | productData.value.push(copied); |
| | | editingProductRow.value = copied; |
| | | productForm.value = copied; |
| | | }; |
| | | |
| | | /** 已审核订单:仅修改含税单价 */ |
| | | const editPriceOnly = (row) => { |
| | | if (operationType.value === "view") return; |
| | | if (!row) return; |
| | | stopOtherEditingRows(); |
| | | row.__editing = true; |
| | | row.__priceOnly = true; // 标记只修改单价 |
| | | }; |
| | | |
| | | const editProductInline = async (row, index) => { |
| | |
| | | handleQuery(); |
| | | }; |
| | | |
| | | /** 批量按钮禁用判断:根据选中行的审核状态控制按钮可用性 |
| | | /** 批量按钮禁用判断:根据选中行的审核状态和订单状态控制按钮可用性 |
| | | * 未审核(0):只能审核、删除、编辑 |
| | | * 已审核(1):可以反审、入库、发货、导出、打印、工艺路线 |
| | | * 已完成(orderStatus=1):所有操作按钮禁用 |
| | | * 未选中任何行时所有批量按钮禁用 |
| | | */ |
| | | const isBatchButtonDisabled = (action) => { |
| | | if (selectedRows.value.length === 0) return true; |
| | | const hasCompleted = selectedRows.value.some(r => Number(r.orderStatus) === 1); |
| | | // 已完成订单:所有操作按钮禁用 |
| | | if (hasCompleted && action !== 'markCompleted') return true; |
| | | const statuses = selectedRows.value.map(r => Number(r.reviewStatus)); |
| | | const allUnreviewed = statuses.every(s => s === 0); |
| | | const allReviewed = statuses.every(s => s === 1); |
| | |
| | | return !allUnreviewed; |
| | | case 'print': |
| | | return !allReviewed; |
| | | case 'markCompleted': |
| | | // 只有已审核且未完成的订单才能标记完成 |
| | | return !allReviewed || hasCompleted; |
| | | default: |
| | | return false; |
| | | } |
| | |
| | | return; |
| | | } |
| | | if (!reverseAuditForm.counterReviewDesc.trim()) { |
| | | proxy.$modal.msgWarning("请输入反审核描述"); |
| | | proxy.$modal.msgWarning("请输入反审核原因"); |
| | | return; |
| | | } |
| | | try { |
| | |
| | | getList(); |
| | | } catch (error) { |
| | | console.log(error); |
| | | } |
| | | }; |
| | | |
| | | /** 标记完成操作 */ |
| | | const handleMarkCompleted = async () => { |
| | | if (selectedRows.value.length === 0) { |
| | | proxy.$modal.msgWarning("请选择要标记完成的数据"); |
| | | return; |
| | | } |
| | | const cannotComplete = selectedRows.value.filter( |
| | | row => Number(row.reviewStatus) !== 1 || Number(row.orderStatus) === 1 |
| | | ); |
| | | if (cannotComplete.length > 0) { |
| | | proxy.$modal.msgWarning("选中的数据中包含非已审核或已完成的项,请重新选择"); |
| | | return; |
| | | } |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | "标记完成后订单将变为只读,只能查看和上传下载附件,不可撤销。是否确认?", |
| | | "提示", |
| | | { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" } |
| | | ); |
| | | const ids = selectedRows.value.map(row => row.id); |
| | | await markOrderCompleted({ ids }); |
| | | proxy.$modal.msgSuccess("标记完成成功"); |
| | | getList(); |
| | | } catch { |
| | | // 用户取消 |
| | | } |
| | | }; |
| | | |
| | |
| | | }; |
| | | // 打开弹框 |
| | | const openForm = async (type, row) => { |
| | | operationType.value = type; |
| | | // 已完成订单强制为只读模式,但附件上传仍可用 |
| | | const isCompleted = Number(row?.orderStatus) === 1; |
| | | const effectiveType = isCompleted ? 'view' : type; |
| | | operationType.value = effectiveType; |
| | | isCompletedOrder.value = isCompleted; |
| | | form.value = {}; |
| | | productData.value = []; |
| | | selectedQuotation.value = null; |
| | | // 已审核订单编辑时,标记只能修改单价(已完成订单已强制view,此处不会再命中) |
| | | isReviewedEdit.value = effectiveType === "edit" && Number(row?.reviewStatus) === 1; |
| | | let userLists = await userListNoPage(); |
| | | userList.value = userLists.data; |
| | | customerList().then(res => { |
| | |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | isCompletedOrder.value = false; |
| | | isReviewedEdit.value = false; |
| | | }; |
| | | |
| | | const productIndex = ref(0); |
| | |
| | | const res = await getSalesInvoices(selectedIds); |
| | | const salesInvoiceData = res?.data ?? {}; |
| | | await printSalesDeliveryNote(salesInvoiceData, selectedRow, selectedIds); |
| | | // 打印成功后递增单据打印次数 |
| | | selectedIds.forEach(id => { |
| | | incrementPrintCount({ id, printType: 'document' }).catch(() => {}); |
| | | }); |
| | | } catch (error) { |
| | | console.error("打印销售发货单失败:", error); |
| | | proxy.$modal.msgError("打印失败,请稍后重试"); |
| | |
| | | const res = await getSalesOrder(selectedId); |
| | | const salesOrderData = res?.data ?? {}; |
| | | printSalesOrder(salesOrderData); |
| | | // 打印成功后递增单据打印次数 |
| | | incrementPrintCount({ id: selectedId, printType: 'document' }).catch(() => {}); |
| | | } else { |
| | | const res = await getProcessCard(selectedId); |
| | | const processCardData = res?.data ?? {}; |
| | |
| | | return; |
| | | } |
| | | await printFinishedProcessCard(processCardData); |
| | | // 打印成功后递增单据打印次数 |
| | | incrementPrintCount({ id: selectedId, printType: 'document' }).catch(() => {}); |
| | | } else { |
| | | await printFinishedProcessCard(processCardData); |
| | | // 打印成功后递增单据打印次数 |
| | | incrementPrintCount({ id: selectedId, printType: 'document' }).catch(() => {}); |
| | | } |
| | | } |
| | | } catch (error) { |
| | |
| | | return; |
| | | } |
| | | printSalesLabel(labelList); |
| | | // 打印成功后递增标签打印次数 |
| | | incrementPrintCount({ id: selectedId, printType: 'label' }).catch(() => {}); |
| | | } catch (error) { |
| | | console.error("打印标签失败:", error); |
| | | proxy.$modal.msgError("打印标签失败,请稍后重试"); |
| | |
| | | flex: 0 0 100%; |
| | | } |
| | | } |
| | | |
| | | .reverse-audit-warning { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | padding: 10px 12px; |
| | | margin-top: 8px; |
| | | background-color: #fdf6ec; |
| | | border: 1px solid #faecd8; |
| | | border-radius: 4px; |
| | | color: #e6a23c; |
| | | font-size: 13px; |
| | | line-height: 1.6; |
| | | } |
| | | |
| | | .reverse-audit-dialog .el-radio { |
| | | display: flex; |
| | | align-items: center; |
| | | height: 36px; |
| | | margin-right: 0; |
| | | margin-bottom: 8px; |
| | | } |
| | | </style> |