gaoluyang
11 小时以前 c7aebff7f6184b2d8da2669d2db5656e2bc09ec4
湟水峡
1.反馈登记删减字段
2.售后服务字段匹配错误问题
已修改5个文件
529 ■■■■ 文件已修改
src/views/customerService/afterSalesHandling/index.vue 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/customerService/feedbackRegistration/components/formDia.vue 93 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/customerService/feedbackRegistration/index.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/issueManagement/Record.vue 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/Record.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/customerService/afterSalesHandling/index.vue
@@ -153,18 +153,18 @@
const workOrderStatusOptions = computed(() => work_order_status?.value || []);
const tableColumn = ref([
    {
    label: "工单编号",
    prop:"afterSalesServiceNo",
    width: 150,
    align: "center"
  },
  {
    label: "销售单号",
    prop:"salesContractNo",
    width: 150,
    align: "center"
  },
    // {
  //   label: "工单编号",
  //   prop:"afterSalesServiceNo",
  //   width: 150,
  //   align: "center"
  // },
  // {
  //   label: "销售单号",
  //   prop:"salesContractNo",
  //   width: 150,
  //   align: "center"
  // },
  {
    label: "处理状态",
    prop: "status",
@@ -201,32 +201,32 @@
    prop: "checkNickName",
    align: "center"
  },
  {
    label: "紧急程度",
    prop: "urgency",
    // 根据degreeOfUrgencyOptions字典去自动匹配
    formatData: (params) => {
      if (params) {
        const item = degreeOfUrgencyOptions.value.find(item => item.value === params);
        return item?.label || params;
      }
      return null;
    },
    align: "center"
  },
  {
    label: "售后类型",
    prop: "serviceType",
    // 根据classificationOptions字典去自动匹配
    formatData: (params) => {
      if (params) {
        const item = classificationOptions.value.find(item => item.value === params);
        return item?.label || params;
      }
      return null;
    },
    align: "center"
  },
  // {
  //   label: "紧急程度",
  //   prop: "urgency",
  //   // 根据degreeOfUrgencyOptions字典去自动匹配
  //   formatData: (params) => {
  //     if (params) {
  //       const item = degreeOfUrgencyOptions.value.find(item => item.value === params);
  //       return item?.label || params;
  //     }
  //     return null;
  //   },
  //   align: "center"
  // },
  // {
  //   label: "售后类型",
  //   prop: "serviceType",
  //   // 根据classificationOptions字典去自动匹配
  //   formatData: (params) => {
  //     if (params) {
  //       const item = classificationOptions.value.find(item => item.value === params);
  //       return item?.label || params;
  //     }
  //     return null;
  //   },
  //   align: "center"
  // },
    {
    label: "问题描述",
    prop: "proDesc",
src/views/customerService/feedbackRegistration/components/formDia.vue
@@ -32,56 +32,26 @@
                </el-select>
              </el-form-item>
            </el-col>
                        <el-col :span="4">
                            <el-form-item label="关联销售单号:" prop="salesContractNo">
                                <el-select
                                    v-model="form.salesContractNo"
                          @change="associatedSalesOrderNumberChange"
                          filterable
                                >
                                    <el-option
                                        v-for="item in associatedSalesOrderNumberOptions"
                              :key="item.value"
                              :label="item.label"
                              :value="item.value"
                                    />
                                </el-select>
                            </el-form-item>
                        </el-col>
            <el-col :span="4">
              <el-form-item label="售后类型:" prop="serviceType">
                <el-select
                    v-model="form.serviceType"
                    filterable
                >
                  <el-option
                      v-for="dict in serviceTypeOptions"
                      :key="dict.value"
                      :label="dict.label"
                      :value="dict.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="4">
              <el-form-item label="关联销售单号:" prop="salesContractNo">
                <el-select
                    v-model="form.salesContractNo"
                    @change="associatedSalesOrderNumberChange"
                    filterable
                >
                  <el-option
                      v-for="item in associatedSalesOrderNumberOptions"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="4">
              <el-form-item label="紧急程度:" prop="urgency">
                <el-select
                    v-model="form.urgency"
                    filterable
                >
                  <el-option
                      v-for="dict in urgencyOptions"
                      :key="dict.value"
                      :label="dict.label"
                      :value="dict.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="4">
              <el-form-item label="问题描述:" prop="disRes">
              <el-form-item label="问题描述:" prop="proDesc">
                <el-input
                    v-model="form.disRes"
                    v-model="form.proDesc"
                    placeholder="请输入问题描述"
                />
              </el-form-item>
@@ -154,19 +124,11 @@
const data = reactive({
    form: {
    topic: "",
    serviceType: "",
    urgency: "",
    salesLedgerId: null,
    productModelIds: "",
    customerId: null,
    salesContractNo: "",
    disRes: "",
    proDesc: "",
    customerName: ""
    },
    rules: {
    customerName: [{required: true, message: "请选择客户名称", trigger: "change"}],
    serviceType: [{required: true, message: "请选择售后类型", trigger: "change"}],
    urgency: [{required: true, message: "请选择紧急程度", trigger: "change"}],
        feedbackDate: [{required: true, message: "请选择", trigger: "change"}],
    }
})
@@ -181,14 +143,6 @@
  const num = Number(val)
  return Number.isFinite(num) ? num.toFixed(2) : '-'
}
const { post_sale_waiting_list, degree_of_urgency } = proxy.useDict(
  "post_sale_waiting_list",
  "degree_of_urgency"
);
const serviceTypeOptions = computed(() => post_sale_waiting_list?.value || []);
const urgencyOptions = computed(() => degree_of_urgency?.value || []);
const getProductRowId = (row) => {
  return row?.id ?? row?.productModelId ?? row?.modelId ?? `${row?.productCategory || row?.productName || ""}-${row?.specificationModel || row?.model || ""}-${row?.unit || ""}`
@@ -392,12 +346,11 @@
const openDialog =async (type, row) => {
  // 请求多个接口,获取数据
  let res = await getAllCustomerList({
    current: 1,
  size: 1000,
  total: 0,
    current: -1,
  size: -1,
  });
  if(res.records){
    customerNameOptions.value = res.records.map(item => ({
  if(res.data.records){
    customerNameOptions.value = res.data.records.map(item => ({
      label: item.customerName,
      value: item.customerName,
      id: item.id
src/views/customerService/feedbackRegistration/index.vue
@@ -25,15 +25,6 @@
        <el-row :gutter="20">
          <el-col :span="4">
            <el-form-item>
              <el-input
                  v-model="searchForm.afterSalesServiceNo"
                  placeholder="请输入工单编号"
                  clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-form-item>
              <el-select
                  v-model="searchForm.status"
                  placeholder="请选择工单状态"
@@ -48,49 +39,6 @@
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="4">
            <el-form-item>
              <el-select
                  v-model="searchForm.urgency"
                  placeholder="请选择紧急程度"
                  clearable
              >
                <el-option
                    v-for="dict in degreeOfUrgencyOptions"
                    :key="dict.value"
                    :label="dict.label"
                    :value="dict.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
           <el-col :span="4">
            <el-form-item>
              <el-select
                  v-model="searchForm.serviceType"
                  placeholder="请选择售后类型"
                  clearable
              >
                <el-option
                    v-for="dict in classificationOptions"
                    :key="dict.value"
                    :label="dict.label"
                    :value="dict.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
            <el-col :span="4">
              <el-form-item>
                <el-input
                    v-model="searchForm.orderNo"
                    placeholder="请输入销售单号"
                    clearable
                />
              </el-form-item>
            </el-col>
          <!-- 按钮 -->
          <el-col :span="4">
@@ -169,29 +117,12 @@
const data = reactive({
  searchForm : {
    customerName: "",
    status: "",
    urgency: "",
    serviceType: "",
    reviewStatus: "",
    orderNo: "",
  }
});
const { searchForm } = toRefs(data);
const tableColumn = ref([
  {
    label: "工单编号",
    prop:"afterSalesServiceNo",
    width: 150,
    align: "center"
  },
  {
    label: "销售单号",
    prop:"salesContractNo",
    width: 150,
    align: "center"
  },
  {
    label: "处理状态",
    prop: "status",
@@ -228,34 +159,8 @@
    align: "center"
  },
  {
    label: "紧急程度",
    prop: "urgency",
    // 根据degreeOfUrgencyOptions字典去自动匹配
    formatData: (params) => {
      if (params) {
        const item = degreeOfUrgencyOptions.value.find(item => item.value === params);
        return item?.label || params;
      }
      return null;
    },
    align: "center"
  },
  {
    label: "售后类型",
    prop: "serviceType",
    // 根据classificationOptions字典去自动匹配
    formatData: (params) => {
      if (params) {
        const item = classificationOptions.value.find(item => item.value === params);
        return item?.label || params;
      }
      return null;
    },
    align: "center"
  },
  {
    label: "问题描述",
    prop: "disRes",
    prop: "proDesc",
    width:300,
  },
  {
@@ -267,7 +172,6 @@
  {
    dataType: "action",
    label: "操作",
    align: "center",
    fixed: 'right',
    operation: [
      {
@@ -310,20 +214,12 @@
// 字典获取
/* 
post_sale_waiting_list 新增的售后分类
degree_of_urgency 新增的紧急程度
work_order_status 主页的工单状态
review_status 首页的审核状态
*/
const { post_sale_waiting_list, degree_of_urgency, work_order_status, review_status } = proxy.useDict(
  "post_sale_waiting_list",
  "degree_of_urgency",
  "work_order_status",
  "review_status"
const { work_order_status } = proxy.useDict(
  "work_order_status"
);
const classificationOptions = computed(() => post_sale_waiting_list?.value || []);
const degreeOfUrgencyOptions = computed(() => degree_of_urgency?.value || []);
const workOrderStatusOptions = computed(() => work_order_status?.value || []);
// 查询列表
src/views/inventoryManagement/issueManagement/Record.vue
@@ -51,8 +51,6 @@
        <el-table-column fixed="right" label="操作" min-width="90" align="center">
          <template #default="scope">
            <el-button link type="primary" @click="showSubtractModal(scope.row)" :disabled="scope.row.unQualifiedUnLockedQuantity === 0 && scope.row.qualifiedUnLockedQuantity === 0">{{ actionButtonText }}</el-button>
            <el-button link type="primary" v-if="scope.row.unQualifiedUnLockedQuantity > 0 || scope.row.qualifiedUnLockedQuantity > 0" @click="showFrozenModal(scope.row)">冻结</el-button>
            <el-button link type="primary" v-if="scope.row.qualifiedLockedQuantity > 0 || scope.row.unQualifiedLockedQuantity > 0" @click="showThawModal(scope.row)">解冻</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -113,66 +111,6 @@
      </template>
    </el-dialog>
    <!-- 冻结/解冻弹框 -->
    <el-dialog
        v-model="isShowFrozenModal"
        :title="frozenDialogTitle"
        width="800"
        @close="closeFrozenModal"
    >
      <el-form label-width="140px" :model="frozenForm" label-position="top" ref="frozenFormRef">
        <el-form-item
            label="产品名称"
            prop="productModelId"
            :rules="[{ required: true, message: '请选择产品', trigger: 'change' }]"
        >
          <el-button type="primary" disabled>
            {{ frozenForm.productName ? frozenForm.productName : '选择产品' }}
          </el-button>
        </el-form-item>
        <el-form-item label="规格" prop="productModelName">
          <el-input v-model="frozenForm.model" disabled />
        </el-form-item>
        <el-form-item label="单位" prop="unit">
          <el-input v-model="frozenForm.unit" disabled />
        </el-form-item>
        <el-form-item
            label="库存类型"
            prop="type"
            :rules="[{ required: true, message: '请选择库存类型', trigger: 'change' }]"
        >
          <el-select v-model="frozenForm.type" placeholder="请选择库存类型" @change="handleFrozenTypeChange">
            <el-option
              label="合格库存"
              value="qualified"
              :disabled="frozenOperationType === 'frozen' ? currentRecord.qualifiedUnLockedQuantity <= 0 : currentRecord.qualifiedLockedQuantity <= 0"
            />
            <el-option
              label="不合格库存"
              value="unqualified"
              :disabled="frozenOperationType === 'frozen' ? currentRecord.unQualifiedUnLockedQuantity <= 0 : currentRecord.unQualifiedLockedQuantity <= 0"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="数量" prop="qualitity">
          <el-input-number v-model="frozenForm.qualitity" :step="1" :min="1" :max="frozenMaxQuality" style="width: 100%" />
        </el-form-item>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="frozenForm.remark" type="textarea" />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="handleFrozenSubmit">确认</el-button>
          <el-button @click="closeFrozenModal">取消</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
@@ -190,14 +128,6 @@
} from "@/api/inventoryManagement/stockInventory.js";
import {
  subtractStockUnInventory
} from "@/api/inventoryManagement/stockUninventory.js";
import {
  frozenStockInventory,
  thawStockInventory
} from "@/api/inventoryManagement/stockInventory.js";
import {
  frozenStockUninventory,
  thawStockUninventory
} from "@/api/inventoryManagement/stockUninventory.js";
import { getCurrentDate } from "@/utils/index.js";
import {
@@ -234,47 +164,25 @@
// 是否显示领用/发货弹框
const isShowSubtractModal = ref(false)
// 是否显示冻结/解冻弹框
const isShowFrozenModal = ref(false)
// 冻结/解冻操作类型
const frozenOperationType = ref('frozen')
// 判断是否是成品(产品名称包含"成品")
const isFinishedProduct = computed(() => {
  return props.productName && props.productName.includes('成品')
  return props.productName && props.productName.includes('销售')
})
// 按钮文字:成品显示"发货",其他显示"领用"
const actionButtonText = computed(() => {
  return isFinishedProduct.value ? '发货' : '领用'
  return isFinishedProduct.value ? '出库' : '领用'
})
// 弹框标题
const dialogTitle = computed(() => {
  return isFinishedProduct.value ? '发货' : '领用'
})
// 冻结/解冻弹框标题
const frozenDialogTitle = computed(() => {
  return frozenOperationType.value === 'frozen' ? '冻结' : '解冻'
  return isFinishedProduct.value ? '出库' : '领用'
})
// 领用/发货表单
const subtractFormRef = ref(null)
const subtractForm = ref({
  productId: undefined,
  productModelId: undefined,
  productName: "",
  model: "",
  unit: "",
  type: "",
  qualitity: 0,
  remark: '',
})
// 冻结/解冻表单
const frozenFormRef = ref(null)
const frozenForm = ref({
  productId: undefined,
  productModelId: undefined,
  productName: "",
@@ -292,25 +200,6 @@
    max = currentRecord.value.qualifiedUnLockedQuantity ? currentRecord.value.qualifiedUnLockedQuantity : 0;
  } else {
    max = currentRecord.value.unQualifiedUnLockedQuantity ? currentRecord.value.unQualifiedUnLockedQuantity : 0;
  }
  return Math.max(max, 1);
})
// 冻结/解冻最大数量
const frozenMaxQuality = computed(() => {
  let max = 0;
  if (frozenOperationType.value === 'frozen') {
    if (frozenForm.value.type === 'qualified') {
      max = currentRecord.value.qualifiedUnLockedQuantity ? currentRecord.value.qualifiedUnLockedQuantity : 0;
    } else {
      max = currentRecord.value.unQualifiedUnLockedQuantity ? currentRecord.value.unQualifiedUnLockedQuantity : 0;
    }
  } else {
    if (frozenForm.value.type === 'qualified') {
      max = currentRecord.value.qualifiedLockedQuantity ? currentRecord.value.qualifiedLockedQuantity : 0;
    } else {
      max = currentRecord.value.unQualifiedLockedQuantity ? currentRecord.value.unQualifiedLockedQuantity : 0;
    }
  }
  return Math.max(max, 1);
})
@@ -405,11 +294,6 @@
  subtractForm.value.qualitity = 0;
}
// 冻结类型改变
const handleFrozenTypeChange = () => {
  frozenForm.value.qualitity = 0;
}
// 提交领用/发货
const handleSubtractSubmit = () => {
  proxy.$refs["subtractFormRef"].validate(valid => {
@@ -430,91 +314,6 @@
          proxy.$modal.msgSuccess("提交成功");
          getList();
        })
      }
    }
  })
}
// 点击冻结
const showFrozenModal = (row) => {
  currentRecord.value = row
  frozenOperationType.value = 'frozen'
  frozenForm.value = {
    ...row,
    type: '',
    qualitity: 0,
    remark: '',
  }
  isShowFrozenModal.value = true
}
// 点击解冻
const showThawModal = (row) => {
  currentRecord.value = row
  frozenOperationType.value = 'thaw'
  frozenForm.value = {
    ...row,
    type: '',
    qualitity: 0,
    remark: '',
  }
  isShowFrozenModal.value = true
}
// 关闭冻结/解冻弹框
const closeFrozenModal = () => {
  frozenForm.value = {
    productId: undefined,
    productModelId: undefined,
    productName: "",
    model: "",
    unit: "",
    type: "",
    qualitity: 0,
    remark: '',
  }
  isShowFrozenModal.value = false
}
// 提交冻结/解冻
const handleFrozenSubmit = () => {
  proxy.$refs["frozenFormRef"].validate(valid => {
    if (valid) {
      if (!frozenForm.value.productModelId) {
        proxy.$modal.msgError("请选择产品");
        return;
      }
      const isQualified = frozenForm.value.type === 'qualified'
      const isFrozen = frozenOperationType.value === 'frozen'
      if (isQualified) {
        if (isFrozen) {
          frozenStockInventory(frozenForm.value).then(res => {
            isShowFrozenModal.value = false;
            proxy.$modal.msgSuccess("冻结成功");
            getList();
          })
        } else {
          thawStockInventory(frozenForm.value).then(res => {
            isShowFrozenModal.value = false;
            proxy.$modal.msgSuccess("解冻成功");
            getList();
          })
        }
      } else {
        if (isFrozen) {
          frozenStockUninventory(frozenForm.value).then(res => {
            isShowFrozenModal.value = false;
            proxy.$modal.msgSuccess("冻结成功");
            getList();
          })
        } else {
          thawStockUninventory(frozenForm.value).then(res => {
            isShowFrozenModal.value = false;
            proxy.$modal.msgSuccess("解冻成功");
            getList();
          })
        }
      }
    }
  })
src/views/inventoryManagement/stockManagement/Record.vue
@@ -33,13 +33,7 @@
        <el-table-column label="库存预警数量" prop="warnNum"  show-overflow-tooltip />
        <el-table-column label="备注" prop="remark"  show-overflow-tooltip />
        <el-table-column label="最近更新时间" prop="updateTime" show-overflow-tooltip />
        <el-table-column fixed="right" label="操作" min-width="90" align="center">
          <template #default="scope">
            <el-button link type="primary" @click="showSubtractModal(scope.row)" :disabled="scope.row.unQualifiedUnLockedQuantity === 0 && scope.row.qualifiedUnLockedQuantity === 0">领用</el-button>
            <el-button link type="primary" v-if="scope.row.unQualifiedUnLockedQuantity > 0 || scope.row.qualifiedUnLockedQuantity > 0" @click="showFrozenModal(scope.row)">冻结</el-button>
            <el-button link type="primary" v-if="scope.row.qualifiedLockedQuantity > 0 || scope.row.unQualifiedLockedQuantity > 0" @click="showThawModal(scope.row)">解冻</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
        :page="page.current" :limit="page.size" @pagination="paginationChange" />
@@ -48,24 +42,11 @@
                 v-model:visible="isShowNewModal"
                 :top-product-parent-id="props.productId"
                 @completed="handleQuery" />
    <subtract-stock-inventory v-if="isShowSubtractModal"
                 v-model:visible="isShowSubtractModal"
                 :record="record"
                 :type="record.stockType"
                 @completed="handleQuery" />
    <!-- 导入库存-->
    <import-stock-inventory v-if="isShowImportModal"
                 v-model:visible="isShowImportModal"
                 type="qualified"
                 @uploadSuccess="handleQuery" />
    <!-- 冻结/解冻库存-->
    <frozen-and-thaw-stock-inventory v-if="isShowFrozenAndThawModal"
                 v-model:visible="isShowFrozenAndThawModal"
                 :record="record"
                 :operation-type="operationType"
                 :type="record.stockType"
                 @completed="handleQuery" />
  </div>
</template>
@@ -85,9 +66,7 @@
});
const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue"));
const SubtractStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Subtract.vue"));
const ImportStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/Import.vue"));
const FrozenAndThawStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/FrozenAndThaw.vue"));
const { proxy } = getCurrentInstance()
const tableData = ref([])
const selectedRows = ref([])
@@ -100,12 +79,6 @@
const total = ref(0)
// 是否显示新增弹框
const isShowNewModal = ref(false)
// 是否显示领用弹框
const isShowSubtractModal = ref(false)
// 是否显示冻结/解冻弹框
const isShowFrozenAndThawModal = ref(false)
// 操作类型
const operationType = ref('frozen')
// 是否显示导入弹框
const isShowImportModal = ref(false)
const data = reactive({
@@ -155,20 +128,6 @@
const showSubtractModal = (row) => {
  record.value = row
  isShowSubtractModal.value = true
}
// 点击冻结
const showFrozenModal = (row) => {
  record.value = row
  isShowFrozenAndThawModal.value = true
  operationType.value = 'frozen'
}
// 点击解冻
const showThawModal = (row) => {
  record.value = row
  isShowFrozenAndThawModal.value = true
  operationType.value = 'thaw'
}
// 表格选择数据