zhangwencui
昨天 ac6322d866ddf29cb482b1bac84c1f44a0a07464
Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New
已修改5个文件
268 ■■■■■ 文件已修改
src/api/qualityManagement/nonconformingManagement.js 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/components/formDia.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/qualityManagement/nonconformingManagement/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/deliveryLedger/index.vue 146 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/qualityManagement/nonconformingManagement.js
@@ -1,42 +1,50 @@
import request from '@/utils/request'
import request from "@/utils/request";
// 查询不合格管理列表
export function qualityUnqualifiedListPage(query) {
    return request({
        url: '/quality/qualityUnqualified/listPage',
        method: 'get',
        params: query,
    })
  return request({
    url: "/quality/qualityUnqualified/listPage",
    method: "get",
    params: query,
  });
}
// 新增不合格管理列表
export function qualityUnqualifiedAdd(query) {
    return request({
        url: '/quality/qualityUnqualified/add',
        method: 'post',
        data: query,
    })
  return request({
    url: "/quality/qualityUnqualified/add",
    method: "post",
    data: query,
  });
}
// 修改不合格管理列表
export function qualityUnqualifiedUpdate(query) {
    return request({
        url: '/quality/qualityUnqualified/update',
        method: 'post',
        data: query,
    })
  return request({
    url: "/quality/qualityUnqualified/update",
    method: "post",
    data: query,
  });
}
// 不合格处理
export function qualityUnqualifiedDeal(query) {
  return request({
    url: "/quality/qualityUnqualified/deal",
    method: "post",
    data: query,
  });
}
// 删除不合格管理列表
export function qualityUnqualifiedDel(query) {
    return request({
        url: '/quality/qualityUnqualified/del',
        method: 'delete',
        data: query,
    })
  return request({
    url: "/quality/qualityUnqualified/del",
    method: "delete",
    data: query,
  });
}
// 查询不合格管理信息
export function getQualityUnqualifiedInfo(query) {
    return request({
        url: '/quality/qualityUnqualified/' + query,
        method: 'get',
        data: query,
    })
}
  return request({
    url: "/quality/qualityUnqualified/" + query,
    method: "get",
    data: query,
  });
}
src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -9,14 +9,6 @@
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="状态:" prop="inspectState">
              <el-select v-model="form.inspectState">
                <el-option label="待处理" :value="0" />
                <el-option label="已处理" :value="1" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="类别:" prop="inspectType">
              <el-select v-model="form.inspectType">
                <el-option label="原材料检验" :value="0" />
@@ -150,7 +142,6 @@
    quantity: "",
    checkCompany: "",
    checkResult: "",
    inspectState: '',
    inspectType: '',
    defectivePhenomena: '',
    dealResult: '',
@@ -178,7 +169,8 @@
  getProductOptions();
  if (operationType.value === 'edit') {
    getQualityUnqualifiedInfo(row.id).then(res => {
      form.value = {...res.data}
      const { inspectState, ...rest } = (res.data || {})
      form.value = { ...rest }
    })
  }
}
@@ -222,13 +214,15 @@
const submitForm = () => {
  proxy.$refs.formRef.validate(valid => {
    if (valid) {
      // 状态字段不在表单填写,也不传给后端
      const { inspectState, ...payload } = (form.value || {})
      if (operationType.value === "add") {
        qualityUnqualifiedAdd(form.value).then(res => {
        qualityUnqualifiedAdd(payload).then(res => {
          proxy.$modal.msgSuccess("提交成功");
          closeDia();
        })
      } else {
        qualityUnqualifiedUpdate(form.value).then(res => {
        qualityUnqualifiedUpdate(payload).then(res => {
          proxy.$modal.msgSuccess("提交成功");
          closeDia();
        })
src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
@@ -9,14 +9,6 @@
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="状态:" prop="inspectState">
              <el-select v-model="form.inspectState">
                <el-option label="待处理" :value="0" />
                <el-option label="已处理" :value="1" />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="类别:" prop="inspectType">
              <el-select v-model="form.inspectType" disabled>
                <el-option label="原材料检验" :value="0" />
@@ -131,8 +123,7 @@
import {productTreeList} from "@/api/basicData/product.js";
import {
  getQualityUnqualifiedInfo,
  qualityUnqualifiedAdd,
  qualityUnqualifiedUpdate
  qualityUnqualifiedDeal
} from "@/api/qualityManagement/nonconformingManagement.js";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
@@ -152,7 +143,6 @@
    quantity: "",
    checkCompany: "",
    checkResult: "",
    inspectState: '',
    inspectType: '',
    defectivePhenomena: '',
    dealResult: '',
@@ -186,7 +176,8 @@
  getProductOptions();
  if (operationType.value === 'edit') {
    getQualityUnqualifiedInfo(row.id).then(res => {
      form.value = {...res.data}
      const { inspectState, ...rest } = (res.data || {})
      form.value = { ...rest }
    })
  }
}
@@ -230,17 +221,12 @@
const submitForm = () => {
  proxy.$refs.formRef.validate(valid => {
    if (valid) {
      if (operationType.value === "add") {
        qualityUnqualifiedAdd(form.value).then(res => {
          proxy.$modal.msgSuccess("提交成功");
          closeDia();
        })
      } else {
        qualityUnqualifiedUpdate(form.value).then(res => {
          proxy.$modal.msgSuccess("提交成功");
          closeDia();
        })
      }
      // 状态字段不在表单填写,也不传给后端;处理统一走 /deal 接口
      const { inspectState, ...payload } = (form.value || {})
      qualityUnqualifiedDeal(payload).then(() => {
        proxy.$modal.msgSuccess("提交成功");
        closeDia();
      })
    }
  })
}
src/views/qualityManagement/nonconformingManagement/index.vue
@@ -185,6 +185,7 @@
        clickFun: (row) => {
          openForm("edit", row);
        },
        disabled: (row) => row.inspectState === 1,
      },
      {
        name: "处理",
@@ -192,6 +193,7 @@
        clickFun: (row) => {
          openInspectionForm("edit", row);
        },
        disabled: (row) => row.inspectState === 1,
      },
    ],
  },
@@ -247,12 +249,20 @@
// 打开弹框
const openForm = (type, row) => {
  if (type !== 'add' && row?.inspectState === 1) {
    proxy.$modal.msgWarning("已处理的数据不能再编辑");
    return;
  }
  nextTick(() => {
    formDia.value?.openDialog(type, row)
  })
};
// 打开处理弹框
const openInspectionForm = (type, row) => {
  if (row?.inspectState === 1) {
    proxy.$modal.msgWarning("已处理的数据不能再处理");
    return;
  }
  nextTick(() => {
    inspectionFormDia.value?.openDialog(type, row)
  })
src/views/salesManagement/deliveryLedger/index.vue
@@ -45,14 +45,20 @@
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column fixed="right" label="操作" width="150" align="center">
        <el-table-column fixed="right" label="操作" width="200" align="center">
          <template #default="scope">
            <el-button 
              link 
              type="primary" 
              size="small" 
              :disabled="isApproving(scope.row.status)"
              :disabled="!isApproved(scope.row.status)"
              @click="openForm('edit', scope.row)">补充发货信息</el-button>
            <el-button
              link
              type="primary"
              size="small"
              @click="openDetail(scope.row)"
            >详情</el-button>
            <el-button 
              link 
              type="danger" 
@@ -166,6 +172,41 @@
        </div>
      </template>
    </el-dialog>
    <!-- 详情弹框 -->
    <el-dialog v-model="detailDialogVisible" title="发货台账详情" width="55%" @close="closeDetail">
      <div v-if="detailRow" class="detail-wrapper">
        <el-descriptions :column="2" border>
          <el-descriptions-item label="销售订单">{{ detailRow.salesContractNo || '--' }}</el-descriptions-item>
          <el-descriptions-item label="发货订单号">{{ detailRow.shippingNo || '--' }}</el-descriptions-item>
          <el-descriptions-item label="客户名称">{{ detailRow.customerName || '--' }}</el-descriptions-item>
          <el-descriptions-item label="发货类型">{{ detailRow.type || '--' }}</el-descriptions-item>
          <el-descriptions-item label="发货日期">{{ detailRow.shippingDate || '--' }}</el-descriptions-item>
          <el-descriptions-item label="审核状态">{{ getApprovalStatusText(detailRow.status) }}</el-descriptions-item>
          <el-descriptions-item label="发货车牌号">{{ detailRow.shippingCarNumber || '--' }}</el-descriptions-item>
          <el-descriptions-item label="快递公司">{{ detailRow.expressCompany || '--' }}</el-descriptions-item>
          <el-descriptions-item label="快递单号" :span="2">{{ detailRow.expressNumber || '--' }}</el-descriptions-item>
        </el-descriptions>
        <div class="detail-images" v-if="detailImages.length">
          <div class="detail-images-title">发货图片</div>
          <el-image
            v-for="img in detailImages"
            :key="img.url"
            :src="img.url"
            :preview-src-list="detailImages.map(i => i.url)"
            fit="cover"
            class="detail-image"
          />
        </div>
        <div v-else class="detail-images-empty">暂无发货图片</div>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="closeDetail">关闭</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
@@ -196,6 +237,31 @@
const total = ref(0);
const deliveryFileList = ref([]);
const javaApi = proxy.javaApi;
// 详情弹框
const detailDialogVisible = ref(false);
const detailRow = ref(null);
const detailImages = ref([]);
const normalizeFileUrl = (rawUrl = '') => {
  let fileUrl = rawUrl || '';
  // Windows 路径转 URL
  if (fileUrl && fileUrl.indexOf('\\') > -1) {
    const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads');
    if (uploadsIndex > -1) {
      const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, '/');
      fileUrl = '/' + relativePath;
    } else {
      const parts = fileUrl.split('\\');
      const fileName = parts[parts.length - 1];
      fileUrl = '/uploads/' + fileName;
    }
  }
  if (fileUrl && !fileUrl.startsWith('http')) {
    if (!fileUrl.startsWith('/')) fileUrl = '/' + fileUrl;
    fileUrl = javaApi + fileUrl;
  }
  return fileUrl;
};
// 上传配置
const upload = reactive({
@@ -284,9 +350,9 @@
// 打开弹框
const openForm = async (type, row) => {
  // 编辑时检查审核状态,只有审核中不能编辑
  if (type === 'edit' && row && isApproving(row.status)) {
    proxy.$modal.msgWarning("审核中的数据不能编辑");
  // 补充发货信息:仅“审核通过”允许编辑
  if (type === 'edit' && row && !isApproved(row.status)) {
    proxy.$modal.msgWarning("只有审核通过的数据才可以补充发货信息");
    return;
  }
  
@@ -307,38 +373,7 @@
    // 如果有图片,将 commonFileList 转换为文件列表格式
    if (row.commonFileList && Array.isArray(row.commonFileList) && row.commonFileList.length > 0) {
      deliveryFileList.value = row.commonFileList.map((file, index) => {
        // 处理 URL:将 Windows 路径转换为可访问的 URL
        let fileUrl = file.url || '';
        console.log('原始 URL:', fileUrl);
        // 如果 URL 是 Windows 路径格式(包含反斜杠),需要转换
        if (fileUrl && fileUrl.indexOf('\\') > -1) {
          // 查找 uploads 关键字的位置,从那里开始提取相对路径
          const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads');
          if (uploadsIndex > -1) {
            // 从 uploads 开始提取路径,并将反斜杠替换为正斜杠
            const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, '/');
            fileUrl = '/' + relativePath;
            console.log('转换后的相对路径:', fileUrl);
          } else {
            // 如果没有找到 uploads,提取最后一个目录和文件名
            const parts = fileUrl.split('\\');
            const fileName = parts[parts.length - 1];
            fileUrl = '/uploads/' + fileName;
            console.log('未找到 uploads,使用文件名:', fileUrl);
          }
        }
        // 确保所有非 http 开头的 URL 都拼接 baseUrl
        if (fileUrl && !fileUrl.startsWith('http')) {
          // 确保路径以 / 开头
          if (!fileUrl.startsWith('/')) {
            fileUrl = '/' + fileUrl;
          }
          // 拼接 baseUrl
          fileUrl = javaApi + fileUrl;
          console.log('最终拼接的 URL:', fileUrl);
        }
        const fileUrl = normalizeFileUrl(file.url || '');
        
        return {
          uid: file.id || Date.now() + index,
@@ -373,6 +408,21 @@
  }
  
  dialogFormVisible.value = true;
};
// 打开详情弹框
const openDetail = (row) => {
  detailRow.value = row || null;
  const list = Array.isArray(row?.commonFileList) ? row.commonFileList : [];
  detailImages.value = list
    .map((f) => ({ url: normalizeFileUrl(f?.url || '') }))
    .filter((i) => !!i.url);
  detailDialogVisible.value = true;
};
const closeDetail = () => {
  detailDialogVisible.value = false;
  detailRow.value = null;
  detailImages.value = [];
};
// 提交表单
@@ -671,5 +721,27 @@
    display: none;
  }
}
.detail-wrapper {
  padding: 8px 0;
}
.detail-images {
  margin-top: 16px;
}
.detail-images-title {
  font-weight: 600;
  margin-bottom: 10px;
  color: #303133;
}
.detail-image {
  width: 120px;
  height: 120px;
  margin-right: 10px;
  margin-bottom: 10px;
  border-radius: 6px;
}
.detail-images-empty {
  margin-top: 16px;
  color: #909399;
}
</style>