feat:反审核操作。可以对已审核的订单进行反审核,反审核的时候可以选择作废还是重新生成一条,并记录反审核描述。选择作废的话则不生成新增订单。选择重新生成的话则跳转到新增台账页面对反审核的销售产品进行编辑保存重新生成一条新增的订单。反审核的订单即使是发货了还是可以反审核,并且需要将对应的入库、出库、发货进行作废。
已修改3个文件
134 ■■■■■ 文件已修改
src/api/salesManagement/salesLedger.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/reverseAuditHistory/index.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/salesManagement/salesLedger.js
@@ -219,4 +219,13 @@
    url: "/sales/ledger/shippedCustomers",
    method: "get",
  })
}
// 反审核操作
export function counterReview(data) {
  return request({
    url: "/sales/ledger/counterReview",
    method: "post",
    data,
  })
}
src/views/salesManagement/reverseAuditHistory/index.vue
@@ -79,6 +79,14 @@
            {{ formattedNumber(null, null, scope.row.contractAmount) }}
          </template>
        </el-table-column>
        <el-table-column label="反审核类型"
                         prop="counterReviewType"
                         width="110"
                         align="center">
          <template #default="scope">
            {{ scope.row.counterReviewType === 1 ? '作废' : scope.row.counterReviewType === 2 ? '重新生成' : '-' }}
          </template>
        </el-table-column>
        <el-table-column label="操作"
                         width="100"
                         align="center"
@@ -115,6 +123,12 @@
          <el-descriptions-item label="合同金额(元)">{{ formattedNumber(null, null, currentSnapshot.contractAmount) }}</el-descriptions-item>
          <el-descriptions-item label="反审时间">{{ formatTime(currentSnapshot.counterReviewTime) }}</el-descriptions-item>
          <el-descriptions-item label="反审人">{{ currentSnapshot.counterReviewPerson }}</el-descriptions-item>
          <el-descriptions-item label="反审核类型">{{ currentSnapshot.counterReviewType === 1 ? '作废' : currentSnapshot.counterReviewType === 2 ? '重新生成' : '-' }}</el-descriptions-item>
        </el-descriptions>
        <el-descriptions border
                         :column="1"
                         style="margin-top: 10px;">
          <el-descriptions-item label="反审核描述">{{ currentSnapshot.counterReviewDesc || '无' }}</el-descriptions-item>
        </el-descriptions>
        <el-divider content-position="left"
                    style="margin-top: 30px;">产品信息</el-divider>
src/views/salesManagement/salesLedger/index.vue
@@ -1839,13 +1839,39 @@
        </el-button>
      </div>
    </el-dialog>
    <!-- 反审核弹窗 -->
    <el-dialog v-model="reverseAuditDialogVisible"
               title="反审核"
               width="450px"
               :close-on-click-modal="false">
      <el-form label-width="100px">
        <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-group>
        </el-form-item>
        <el-form-item label="反审核描述">
          <el-input v-model="reverseAuditForm.counterReviewDesc"
                    type="textarea"
                    :rows="3"
                    placeholder="请输入反审核描述" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="reverseAuditDialogVisible = false">取消</el-button>
        <el-button type="primary"
                   @click="confirmReverseAudit"
                   :disabled="!reverseAuditForm.counterReviewType || !reverseAuditForm.counterReviewDesc">确定</el-button>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
  import { getToken } from "@/utils/auth";
  import pagination from "@/components/PIMTable/Pagination.vue";
  import { onMounted, ref, getCurrentInstance, watch, nextTick } from "vue";
  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";
@@ -1877,6 +1903,7 @@
    getSalesInvoices,
    getSalesLabel,
    salesStock,
    counterReview,
  } from "@/api/salesManagement/salesLedger.js";
  import { modelList, productTreeList } from "@/api/basicData/product.js";
  import useFormData from "@/hooks/useFormData.js";
@@ -3074,10 +3101,17 @@
    }
  };
  /** 反审按钮操作 */
  const handleReverseAudit = async () => {
  /** 反审核弹窗状态 */
  const reverseAuditDialogVisible = ref(false);
  const reverseAuditForm = reactive({
    counterReviewType: null,
    counterReviewDesc: "",
  });
  /** 反审按钮操作 — 打开弹窗 */
  const handleReverseAudit = () => {
    if (selectedRows.value.length === 0) {
      proxy.$modal.msgWarning("请选择要反审的数据");
      proxy.$modal.msgWarning("请选择要反审核的数据");
      return;
    }
    const canNotReverse = selectedRows.value.filter(
@@ -3087,24 +3121,77 @@
      proxy.$modal.msgWarning("选中的数据中包含非已审核项,请重新选择");
      return;
    }
    // 重置弹窗表单
    reverseAuditForm.counterReviewType = null;
    reverseAuditForm.counterReviewDesc = "";
    reverseAuditDialogVisible.value = true;
  };
  /** 反审核确认操作 */
  const confirmReverseAudit = async () => {
    if (!reverseAuditForm.counterReviewType) {
      proxy.$modal.msgWarning("请选择反审核类型");
      return;
    }
    if (!reverseAuditForm.counterReviewDesc.trim()) {
      proxy.$modal.msgWarning("请输入反审核描述");
      return;
    }
    try {
      await ElMessageBox.confirm("是否确认反审选中的销售台账?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      const ids = selectedRows.value.map(row => row.id);
      const res = await counterReview({
        ids,
        counterReviewType: reverseAuditForm.counterReviewType,
        counterReviewDesc: reverseAuditForm.counterReviewDesc,
      });
      reverseAuditDialogVisible.value = false;
      proxy.$modal.msgSuccess("反审核成功");
      for (const row of selectedRows.value) {
        await addOrUpdateSalesLedger({ ...row, reviewStatus: 2 });
      // 重新生成类型:跳转到新增台账页面(预填数据)
      if (reverseAuditForm.counterReviewType === 2 && res.newLedgerIds && res.newLedgerIds.length > 0) {
        // 单条反审时跳转到新增页面编辑新台账
        if (res.newLedgerIds.length === 1) {
          const newId = res.newLedgerIds[0];
          getSalesLedgerWithProducts({ id: newId, type: 1 }).then(detail => {
            openFormWithPreFill(detail);
          });
        }
      }
      proxy.$modal.msgSuccess("反审成功");
      getList();
    } catch (error) {
      console.log(error);
    }
  };
  /** 用预填数据打开新增台账页面(重新生成场景) */
  const openFormWithPreFill = async (detail) => {
    operationType.value = "add";
    form.value = {};
    productData.value = [];
    selectedQuotation.value = null;
    let userLists = await userListNoPage();
    userList.value = userLists.data;
    customerList().then(res => {
      customerOption.value = res;
    });
    // 预填原台账数据到新增表单
    form.value.customerId = detail.customerId;
    form.value.customerName = detail.customerName;
    form.value.projectName = detail.projectName;
    form.value.salesman = detail.salesman;
    form.value.entryPerson = Number(userStore.id);
    form.value.entryDate = getCurrentDate();
    form.value.executionDate = detail.executionDate || getCurrentDate();
    form.value.deliveryDate = detail.deliveryDate;
    form.value.paymentMethod = detail.paymentMethod;
    form.value.contractAmount = detail.contractAmount;
    form.value.remarks = detail.remarks;
    form.value.customerRemarks = detail.customerRemarks ?? detail.customer_remarks ?? "";
    productData.value = detail.productData || [];
    form.value.deliveryDate = dayjs(form.value.entryDate).add(7, "day").format("YYYY-MM-DD");
    dialogFormVisible.value = true;
  };
  const paginationChange = obj => {
    page.current = obj.page;
    page.size = obj.limit;