Jelajahi Sumber

修改工作台bug

hurx 21 jam lalu
induk
melakukan
1e7dfcac34

+ 8 - 5
src/views/enterprise/purchaseHistory/index.vue

@@ -79,11 +79,13 @@
           <div v-for="(item, itemIndex) in order.expanded ? order.products : order.products.slice(0, 5)" :key="itemIndex" class="product-row">
             <div class="product-info-cell">
               <div class="product-image">
-                <el-image :src="item.image" fit="contain"
-                  ><template #error
-                    ><div class="image-placeholder">
-                      <el-icon :size="30" color="#ccc"><Picture /></el-icon></div></template
-                ></el-image>
+                <div class="product-image" @click="onPath(`/item?id=${item.productId}&productNo=${item.spec2}`)">
+                  <el-image :src="item.image" fit="contain"
+                    ><template #error
+                      ><div class="image-placeholder">
+                        <el-icon :size="30" color="#ccc"><Picture /></el-icon></div></template
+                  ></el-image>
+                </div>
               </div>
               <div class="product-detail">
                 <div class="product-name ellipsis">{{ item.name }}</div>
@@ -134,6 +136,7 @@ import { ElMessage } from 'element-plus';
 import { getDeptTree } from '@/api/pc/organization';
 import { DeptInfo } from '@/api/pc/organization/types';
 import { addProductShoppingCart } from '@/api/goods/index';
+import { onPath } from '@/utils/siteConfig';
 import { parseTime } from '@/utils/ruoyi';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { order_status, pay_method } = toRefs<any>(proxy?.useDict('order_status', 'pay_method'));

+ 13 - 9
src/views/i/index.vue

@@ -9,7 +9,10 @@
         </el-form-item>
         <el-form-item label="手机号码" prop="phone">
           <el-input v-model="formData.phone" placeholder="请输入" />
-          <div class="form-tip">手机号码用于登录账号、重置密码或其他安全认证 <el-button type="danger" link>更换手机号</el-button></div>
+          <div class="form-tip">
+            手机号码用于登录账号、重置密码或其他安全认证
+            <el-button @click="onPath(`/enterprise/securitySetting/changePhone?phone=${formData.phone}`)" type="danger" link>更换手机号</el-button>
+          </div>
         </el-form-item>
       </div>
 
@@ -28,10 +31,13 @@
             <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value" />
           </el-select>
         </el-form-item>
-        <el-form-item label="角色" prop="role">
+        <!-- <el-form-item label="角色" prop="role">
           <el-select v-model="formData.role" placeholder="请选择" style="width: 100%">
             <el-option v-for="role in roleList" :key="role.roleId" :label="role.roleName" :value="role.roleId.toString()" />
           </el-select>
+        </el-form-item> -->
+        <el-form-item label="微信号" prop="wechat">
+          <el-input v-model="formData.wechat" placeholder="请输入" />
         </el-form-item>
       </div>
 
@@ -39,8 +45,10 @@
         <el-form-item label="生日" prop="birthday">
           <el-date-picker v-model="formData.birthday" type="date" placeholder="请选择日期" style="width: 100%" />
         </el-form-item>
-        <el-form-item label="微信号" prop="wechat">
-          <el-input v-model="formData.wechat" placeholder="请输入" />
+        <el-form-item label="所属部门" prop="department">
+          <el-select v-model="formData.department" placeholder="请选择" style="width: 100%">
+            <el-option v-for="dept in deptList" :key="dept.deptId" :label="dept.deptName" :value="dept.deptId.toString()" />
+          </el-select>
         </el-form-item>
       </div>
 
@@ -48,11 +56,6 @@
         <el-form-item label="邮箱" prop="email">
           <el-input v-model="formData.email" placeholder="请输入" />
         </el-form-item>
-        <el-form-item label="所属部门" prop="department">
-          <el-select v-model="formData.department" placeholder="请选择" style="width: 100%">
-            <el-option v-for="dept in deptList" :key="dept.deptId" :label="dept.deptName" :value="dept.deptId.toString()" />
-          </el-select>
-        </el-form-item>
       </div>
 
       <div class="form-row single">
@@ -84,6 +87,7 @@
 import { ref, reactive, onMounted } from 'vue';
 import { ElMessage } from 'element-plus';
 import { PageTitle } from '@/components';
+import { onPath } from '@/utils/siteConfig';
 import { getCurrentUserInfo, updateContact, getDeptList, getDeptTree, getRoleList } from '@/api/pc/organization';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { sys_user_sex } = toRefs<any>(proxy?.useDict('sys_user_sex'));

+ 8 - 5
src/views/order/afterSale/index.vue

@@ -246,6 +246,7 @@ import {
   updateComplaintsSuggestions,
   deleteComplaintsSuggestions
 } from '@/api/pc/valueAdded';
+import { onPath } from '@/utils/siteConfig';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { service_type, complaints_suggestion_type } = toRefs<any>(proxy?.useDict('service_type', 'complaints_suggestion_type'));
 
@@ -356,7 +357,7 @@ const allComplaintData = ref([]);
 
 const afterSaleList = computed(() => {
   let list = allAfterSaleData.value.filter((item) => item.type === activeMainTab.value);
-  if (activeStatusTab.value !== 'all') list = list.filter((item) => item.status === activeStatusTab.value);
+  if (activeStatusTab.value !== 'all') list = list.filter((item) => item.returnStatus === activeStatusTab.value);
   return list;
 });
 
@@ -387,10 +388,12 @@ const getStatusClass = (status: string) => {
   return map[status] || 'info';
 };
 const handleViewDetail = async (item: any) => {
-  returnDialogVisible.value = true;
-  await getOrderReturnInfo(item.id).then((res) => {
-    returnItemList.value = res.data.orderReturnItemList;
-  });
+  // returnDialogVisible.value = true;
+  // await getOrderReturnInfo(item.id).then((res) => {
+  //   returnItemList.value = res.data.orderReturnItemList;
+  // });
+  // 跳转到售后详情页面,传递售后单ID和查看模式标志
+  onPath('/order/orderManage/applyAfter?returnId=' + item.id + '&viewMode=true');
 };
 
 const handleReturn = async (row: any) => {

+ 3 - 2
src/views/order/orderAudit/index.vue

@@ -58,7 +58,7 @@
         <div class="product-list">
           <div v-for="(item, itemIndex) in order.expanded ? order.products : order.products.slice(0, 5)" :key="itemIndex" class="product-row">
             <div class="product-cell product-info-cell">
-              <div class="product-image">
+              <div class="product-image" @click="onPath(`/item?id=${item.spec2}&productNo=${item.spec2}`)">
                 <el-image :src="item.image" fit="contain">
                   <template #error>
                     <div class="image-placeholder">
@@ -154,6 +154,7 @@ import { PageTitle, StatusTabs } from '@/components';
 import { getDeptTree } from '@/api/pc/organization';
 import { DeptInfo } from '@/api/pc/organization/types';
 import { parseTime } from '@/utils/ruoyi';
+import { onPath } from '@/utils/siteConfig';
 import { getOrderList, getOrderProducts, checkOrderStatus, getCheckOrderIds } from '@/api/pc/enterprise/order';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { complaints_suggestion_type } = toRefs<any>(proxy?.useDict('complaints_suggestion_type'));
@@ -557,7 +558,7 @@ const handleSubmitAudit = async () => {
           border-radius: 4px;
           overflow: hidden;
           flex-shrink: 0;
-
+          cursor: pointer;
           .el-image {
             width: 100%;
             height: 100%;

+ 12 - 9
src/views/order/orderEvaluation/index.vue

@@ -70,20 +70,22 @@
           >
             <div class="product-info-cell">
               <div class="product-image">
-                <el-image :src="product.image" fit="contain">
-                  <template #error>
-                    <div class="image-placeholder">
-                      <el-icon :size="30" color="#ccc"><Picture /></el-icon>
-                    </div>
-                  </template>
-                </el-image>
+                <div class="product-image" @click="onPath(`/item?id=${product.id}&productNo=${product.spec2}`)">
+                  <el-image :src="product.image" fit="contain">
+                    <template #error>
+                      <div class="image-placeholder">
+                        <el-icon :size="30" color="#ccc"><Picture /></el-icon>
+                      </div>
+                    </template>
+                  </el-image>
+                </div>
               </div>
               <div class="product-detail">
                 <div class="product-name ellipsis">{{ product.name }}</div>
-                <div class="product-spec">{{ product.spec1 }} | {{ product.spec2 }}</div>
+                <div class="product-spec">{{ product.spec1 }} x{{ product.quantity }} | {{ product.spec2 }}</div>
                 <div class="product-price">¥{{ product.price }}</div>
               </div>
-              <div class="product-quantity">x{{ product.quantity }}</div>
+              <!-- <div class="product-quantity">x{{ product.quantity }}</div> -->
             </div>
 
             <!-- 金额、状态、操作列只在第一行显示 (保持原有逻辑) -->
@@ -131,6 +133,7 @@ import { ElMessage } from 'element-plus';
 import { PageTitle, StatusTabs } from '@/components';
 import { getOrderList, getOrderProducts, getEvalutionList } from '@/api/pc/enterprise/order';
 import type { OrderMain, OrderStatusStats } from '@/api/pc/enterprise/orderTypes';
+import { onPath } from '@/utils/siteConfig';
 import { getDeptTree } from '@/api/pc/organization';
 import { DeptInfo } from '@/api/pc/organization/types';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;

+ 79 - 15
src/views/order/orderManage/applyAfter.vue

@@ -8,7 +8,7 @@
               <Clock />
             </el-icon>
           </div>
-          <div class="header-title">申请售后</div>
+          <div class="header-title">{{ viewMode ? '售后详情' : '申请售后' }}</div>
         </div>
 
         <div class="header-center">
@@ -34,7 +34,7 @@
         <div class="panel">
           <div class="panel-title">选择服务类型:</div>
           <div class="service-type">
-            <el-radio-group v-model="form.serviceType" size="large">
+            <el-radio-group v-model="form.serviceType" size="large" :disabled="viewMode">
               <el-radio-button label="1">退换货</el-radio-button>
               <el-radio-button label="3">维修</el-radio-button>
             </el-radio-group>
@@ -111,12 +111,12 @@
           <div class="panel-title">售后服务单信息:</div>
           <el-form ref="formRef" :model="form" :rules="rules" label-width="80px" class="after-form">
             <el-form-item label="退货原因" prop="returnReasonId">
-              <el-select v-model="form.returnReasonId" placeholder="请选择" style="width: 200px" @change="handleReturnReasonChange">
+              <el-select v-model="form.returnReasonId" placeholder="请选择" style="width: 200px" @change="handleReturnReasonChange" :disabled="viewMode">
                 <el-option v-for="r in reasonOptions" :key="r.id" :label="r.returnReasonName" :value="r.id" />
               </el-select>
             </el-form-item>
             <el-form-item label="问题描述" prop="problemDescription">
-              <el-input v-model="form.problemDescription" type="textarea" :rows="5" placeholder="请输入问题描述" />
+              <el-input v-model="form.problemDescription" type="textarea" :rows="5" placeholder="请输入问题描述" :disabled="viewMode" />
             </el-form-item>
             <!-- <el-form-item label="凭证图片">
               <el-upload v-model:file-list="form.voucherPhotoArray" list-type="picture-card" :action="action" :auto-upload="false" :limit="5">
@@ -129,11 +129,12 @@
                   <img class="upload-img" :src="item" />
                   <div class="upload-box">
                     <el-icon @click="previewImage(item)" color="#ffffff" size="20" class="mr-[20px] icons"><Search /></el-icon>
-                    <el-icon @click="onDel(index)" color="#ffffff" size="20" class="icons"><Delete /></el-icon>
+                    <el-icon @click="!viewMode && onDel(index)" color="#ffffff" size="20" class="icons"><Delete /></el-icon>
                   </div>
                 </div>
               </div>
               <el-upload
+                v-if="!viewMode"
                 class="avatar-uploader"
                 :action="action"
                 :limit="5"
@@ -149,7 +150,7 @@
           </el-form>
         </div>
 
-        <div class="panel">
+        <!-- <div class="panel">
           <div class="panel-title">选择取件方式:</div>
           <el-radio-group v-model="form.returnMethod" class="pickup-type">
             <el-radio label="1">上门取件</el-radio>
@@ -188,9 +189,9 @@
               <div class="pickup-row hint">提交服务单后,售后专员可能与您电话沟通,请保持手机畅通</div>
             </div>
           </div>
-        </div>
+        </div> -->
 
-        <div class="footer">
+        <div class="footer" v-if="!viewMode">
           <el-button type="danger" class="submit-btn" @click="handleSubmit">提交</el-button>
         </div>
       </div>
@@ -251,6 +252,8 @@ const router = useRouter();
 const route = useRoute();
 const loading = ref(false);
 const orderId = ref<any>(0);
+const viewMode = ref(false); // 查看详情模式
+const returnId = ref<any>(0); // 售后单ID
 
 const addressDialogVisible = ref(false);
 const addressLoading = ref(false);
@@ -493,7 +496,59 @@ const handleBuyAgain = () => {
   ElMessage.info('再次购买');
 };
 
-// 加载订单详情
+// 加载售后详情(查看详情模式)
+const loadReturnDetail = async () => {
+  try {
+    loading.value = true;
+    const res = await getOrderReturnInfo(returnId.value);
+    if (res.code === 200 && res.data) {
+      const data = res.data;
+      // 映射售后信息
+      orderInfo.orderId = data.orderId;
+      orderInfo.orderNo = data.orderNo;
+      form.orderId = data.orderId;
+      form.orderNo = data.orderNo;
+      form.orderAmount = data.orderAmount || '0.00';
+      orderInfo.orderTime = data.returnTime;
+      orderInfo.freight = '0.00';
+      orderInfo.totalAmount = data.afterSaleAmount || '0.00';
+      form.customerNo = data.customerNo;
+      form.serviceType = data.serviceType;
+      form.returnReasonId = data.returnReasonId;
+      form.returnReason = data.returnReason;
+      form.problemDescription = data.problemDescription;
+      form.voucherPhoto = data.voucherPhoto || '';
+
+      // 映射商品信息
+      if (data.orderReturnItemList && data.orderReturnItemList.length > 0) {
+        selectedProducts.value = data.orderReturnItemList.map((p: any) => {
+          return {
+            productId: p.productId,
+            productNo: p.productNo,
+            productUnit: p.productUnit || '',
+            productImage: p.productImage || '',
+            name: p.productName || '',
+            spec: `${p.productUnit || ''} ${p.productNo || ''}`.trim(),
+            unitPrice: Number(p.returnPrice) || Number(p.orderPrice) || 0,
+            soldQty: Number(p.returnQuantity) || 0,
+            availableQty: Number(p.returnQuantity) || 0,
+            returnQuantity: Number(p.returnQuantity) || 0,
+            orderProductId: p.orderProductId,
+            productName: p.productName,
+            reasonDetail: data.returnReason
+          } as ApplyProduct;
+        });
+      }
+    }
+  } catch (error) {
+    console.error('加载售后详情失败:', error);
+    ElMessage.error('加载售后详情失败');
+  } finally {
+    loading.value = false;
+  }
+};
+
+// 加载订单详情(申请模式)
 const loadOrderDetail = async () => {
   try {
     loading.value = true;
@@ -558,14 +613,23 @@ const handleReturnReasonChange = (value: string) => {
 };
 
 onMounted(() => {
-  const paramId = route.query.orderId;
-
-  // 直接使用字符串,不转换为数字,避免精度丢失
-  orderId.value = paramId as string;
-  if (orderId.value) {
+  const paramOrderId = route.query.orderId;
+  const paramReturnId = route.query.returnId;
+  const paramViewMode = route.query.viewMode;
+
+  // 判断是否为查看详情模式
+  viewMode.value = paramViewMode === 'true';
+
+  if (viewMode.value && paramReturnId) {
+    // 查看详情模式:加载售后详情
+    returnId.value = paramReturnId as string;
+    loadReturnDetail();
+  } else if (paramOrderId) {
+    // 申请模式:加载订单详情
+    orderId.value = paramOrderId as string;
     loadOrderDetail();
   } else {
-    console.error('订单ID无效,无法加载订单详情');
+    console.error('订单ID或售后ID无效,无法加载详情');
   }
   loadReturnReason();
   loadEnterpriseInfo();

+ 2 - 1
src/views/order/orderManage/index.vue

@@ -104,7 +104,7 @@
         <div class="product-list">
           <div v-for="(item, itemIndex) in order.expanded ? order.products : order.products.slice(0, 5)" :key="itemIndex" class="product-row">
             <div class="product-info-cell">
-              <div class="product-image">
+              <div class="product-image" @click="onPath(`/item?id=${item.productId}&productNo=${item.spec2}`)">
                 <el-image :src="item.image" fit="contain"
                   ><template #error
                     ><div class="image-placeholder">
@@ -909,6 +909,7 @@ onMounted(() => {
           border-radius: 4px;
           overflow: hidden;
           flex-shrink: 0;
+          cursor: pointer;
           .el-image {
             width: 100%;
             height: 100%;

+ 5 - 2
src/views/organization/deptManage/index.vue

@@ -39,7 +39,7 @@
     <!-- 新增/编辑部门弹窗 -->
     <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px" destroy-on-close>
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px">
-        <el-form-item label="上级部门" prop="parentId">
+        <el-form-item v-if="!isTopLevelDept" label="上级部门" prop="parentId">
           <el-tree-select
             v-model="formData.parentId"
             :data="deptList"
@@ -179,6 +179,9 @@ const formRules = {
 
 const dialogTitle = computed(() => (editingRow.value ? '编辑部门' : '新增部门'));
 
+// 判断是否为顶级部门(编辑模式下,parentId为undefined表示顶级部门)
+const isTopLevelDept = computed(() => editingRow.value && formData.parentId === undefined);
+
 const deptList = ref([]);
 const contactList = ref([]);
 const addressList = ref([]);
@@ -230,7 +233,7 @@ const handleEdit = (row: any) => {
   parentRow.value = null;
   formData.deptId = row.deptId;
   formData.deptName = row.deptName;
-  formData.parentId = row.parentId == 100 ? undefined : row.parentId;
+  formData.parentId = row.parentId == 100 || row.parentId == 0 ? undefined : row.parentId;
   formData.deptManage = row.deptManage;
   formData.status = row.status || '0';
   formData.isLimit = row.isLimit || '1';