Browse Source

工作台接口对接

hurx 2 months ago
parent
commit
1a640aa9b9

+ 24 - 0
src/api/pc/enterprise/index.ts

@@ -144,3 +144,27 @@ export function deleteInvoice(ids: number[]) {
     method: 'delete'
   });
 }
+
+/**
+ * 查询行业类别列表
+ */
+
+export function getIndustryCategoryList(params?: any) {
+  return request({
+    url: '/customer/pcIndustryCategory/list',
+    method: 'get',
+    params: params
+  });
+}
+
+/**
+ * 查询行业类别列表
+ */
+
+export function getEnterpriseScaleList(params?: any) {
+  return request({
+    url: '/customer/pcEnterpriseScale/list',
+    method: 'get',
+    params: params
+  });
+}

+ 13 - 0
src/api/pc/enterprise/order.ts

@@ -78,6 +78,19 @@ export function deleteOrder(ids: number[]) {
   });
 }
 
+// ==================== 订单管理 ====================
+
+/**
+ * 查询当前企业的已评价订单
+ */
+export function getEvalutionList(params?: any) {
+  return request({
+    url: '/order/pcOrderEvaluation/list',
+    method: 'get',
+    params: params
+  });
+}
+
 /**
  * 新增订单评价
  */

+ 78 - 35
src/views/enterprise/companyInfo/edit.vue

@@ -61,7 +61,7 @@
             <el-col :span="12">
               <el-form-item label="主要办公地址" prop="provincialCityCounty">
                 <el-cascader
-                  v-model="form.officeProvince"
+                  v-model="form.regionCodes"
                   :options="regionData as any"
                   placeholder="请选择省/市/区"
                   style="width: 100%"
@@ -70,32 +70,23 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label=" ">
-                <el-input v-model="form.officeAddress" placeholder="请输入" />
+              <el-form-item label="详细地址" prop="address">
+                <el-input v-model="form.address" placeholder="请输入" />
               </el-form-item>
             </el-col>
           </el-row>
           <el-row :gutter="20">
             <el-col :span="12">
-              <el-form-item label="所属行业" prop="industry">
-                <el-select v-model="form.industry" placeholder="请选择" style="width: 100%">
-                  <el-option label="电力行业" value="电力行业" />
-                  <el-option label="制造业" value="制造业" />
-                  <el-option label="互联网" value="互联网" />
-                  <el-option label="金融业" value="金融业" />
-                  <el-option label="其他" value="其他" />
+              <el-form-item label="所属行业" prop="industryCategoryId">
+                <el-select v-model="form.industryCategoryId" placeholder="请选择" style="width: 100%">
+                  <el-option v-for="item in industryList" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="企业规模" prop="scale">
-                <el-select v-model="form.scale" placeholder="请选择" style="width: 100%">
-                  <el-option label="50人以下" value="50人以下" />
-                  <el-option label="50-200人" value="50-200人" />
-                  <el-option label="200-500人" value="200-500人" />
-                  <el-option label="500-1000人" value="500-1000人" />
-                  <el-option label="1000-5000人" value="1000-5000人" />
-                  <el-option label="5000人以上" value="5000人以上" />
+              <el-form-item label="企业规模" prop="enterpriseScaleId">
+                <el-select v-model="form.enterpriseScaleId" placeholder="请选择" style="width: 100%">
+                  <el-option v-for="item in scaleList" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
               </el-form-item>
             </el-col>
@@ -140,16 +131,16 @@
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="法人身份证" prop="idCard">
+              <el-form-item label="法人身份证" prop="legalPersonCardUrl">
                 <el-upload
                   class="upload-box"
                   action="#"
                   :auto-upload="false"
                   :show-file-list="false"
-                  :on-change="(file: any) => handleUpload(file, 'idCard')"
+                  :on-change="(file: any) => handleUpload(file, 'legalPersonCardUrl')"
                 >
-                  <div v-if="form.idCard" class="upload-preview">
-                    <el-image :src="form.idCard" fit="cover" />
+                  <div v-if="form.legalPersonCardUrl" class="upload-preview">
+                    <el-image :src="form.legalPersonCardUrl" fit="cover" />
                   </div>
                   <div v-else class="upload-placeholder">
                     <el-icon :size="24"><Plus /></el-icon>
@@ -176,7 +167,7 @@ import { ref, reactive, onMounted } from 'vue';
 import { useRouter } from 'vue-router';
 import { ArrowLeft, Plus } from '@element-plus/icons-vue';
 import { ElMessage } from 'element-plus';
-import { getEnterpriseInfo, updateEnterpriseInfo } from '@/api/pc/enterprise';
+import { getEnterpriseInfo, updateEnterpriseInfo, getIndustryCategoryList, getEnterpriseScaleList } from '@/api/pc/enterprise';
 
 import { regionData } from 'element-china-area-data';
 
@@ -190,23 +181,61 @@ const form = reactive({
   registeredCapital: '',
   detailAddress: '',
   businessScope: '',
-  officeProvince: '',
+  provincialCityCounty: '',
   regionCodes: [],
-  officeAddress: '',
-  industry: '',
-  scale: '',
+  regProvincialNo: '',
+  regCityNo: '',
+  regCountyNo: '',
+  address: '',
+  industryCategoryId: '',
+  enterpriseScaleId: '',
   phone: '',
   email: '',
   website: '',
   businessLicense: '',
-  idCard: ''
+  legalPersonCardUrl: ''
 });
 
+// 行业列表
+const industryList = ref([]);
+// 企业规模列表
+const scaleList = ref([]);
+
 const rules = {
   companyName: [{ required: true, message: '请输入企业名称', trigger: 'blur' }],
   creditCode: [{ required: true, message: '请输入统一社会信用代码', trigger: 'blur' }]
 };
 
+// 加载行业分类列表
+const loadIndustryList = async () => {
+  try {
+    const res = await getIndustryCategoryList();
+    if (res.code === 200 && res.rows) {
+      industryList.value = res.rows.map((item: any) => ({
+        label: item.industryCategoryName,
+        value: item.id
+      }));
+    }
+  } catch (error) {
+    console.error('获取行业分类失败:', error);
+  }
+};
+
+// 加载企业规模列表
+const loadScaleList = async () => {
+  try {
+    const res = await getEnterpriseScaleList();
+    if (res.code === 200 && res.rows) {
+      scaleList.value = res.rows.map((item: any) => ({
+        label: item.enterpriseScaleName,
+        value: item.id
+      }));
+    }
+  } catch (error) {
+    console.error('获取企业规模失败:', error);
+  }
+};
+
 // 加载企业信息
 const loadEnterpriseInfo = async () => {
   try {
@@ -219,17 +248,21 @@ const loadEnterpriseInfo = async () => {
       form.creditCode = businessInfo.socialCreditCode || '';
       form.legalPerson = businessInfo.legalPersonName || '';
       form.registeredCapital = businessInfo.registeredCapital || '';
-      form.detailAddress = businessInfo.businessAddress || '';
+      form.detailAddress = businessInfo.businessAddress || data.address || '';
       form.businessScope = businessInfo.bussinessRange || '';
-      form.officeAddress = data.address || '';
-      form.officeProvince = data.provincialCityCounty || '';
-      form.industry = data.industryCategory || '';
-      form.scale = data.enterpriseScale || '';
+      form.address = data.address || '';
+      form.provincialCityCounty = data.provincialCityCounty || '';
+      form.industryCategoryId = data.industryCategoryId || '';
+      form.enterpriseScaleId = data.enterpriseScaleId || '';
+      form.regionCodes = [data.regProvincialNo, data.regCityNo, data.regCountyNo];
       form.phone = data.landline || '';
       form.email = businessInfo.email || data.fax || '';
       form.website = data.url || '';
       form.businessLicense = businessInfo.businessLicense || '';
-      form.idCard = businessInfo.idCard || '';
+      form.legalPersonCardUrl = businessInfo.legalPersonCardUrl || '';
+
+      // 调试映射后的表单数据
+      console.log('映射后的detailAddress:', form.detailAddress);
     }
   } catch (error) {
     console.error('加载企业信息失败:', error);
@@ -266,11 +299,13 @@ const handleRegionChange = (value: string[]) => {
     }
 
     // 将省市区名称用斜杠连接
-    form.officeProvince = names.join('/');
+    form.provincialCityCounty = names.join('/');
   }
 };
 
 onMounted(() => {
+  loadIndustryList();
+  loadScaleList();
   loadEnterpriseInfo();
 });
 
@@ -291,6 +326,13 @@ const handleSave = async () => {
   if (!valid) return;
 
   try {
+    // 如果选择了省市区,发送代码
+    if (form.regionCodes && form.regionCodes.length === 3) {
+      form.regProvincialNo = form.regionCodes[0];
+      form.regCityNo = form.regionCodes[1];
+      form.regCountyNo = form.regionCodes[2];
+      form.provincialCityCounty = form.provincialCityCounty;
+    }
     await updateEnterpriseInfo(form as any);
     ElMessage.success('保存成功');
     handleBack();
@@ -304,6 +346,7 @@ const handleSave = async () => {
 .company-edit-container {
   background: #f5f5f5;
   min-height: 100%;
+  width: 100%;
 }
 
 .page-header {

+ 4 - 3
src/views/enterprise/companyInfo/index.vue

@@ -156,6 +156,7 @@ const companyData = reactive({
   customerType: '品牌客户',
   availableAmount: '0.00',
   creditAmount: '0.00',
+  temporaryQuota: '0.00',
   creditCode: '-',
   industry: '-',
   scale: '-',
@@ -185,7 +186,7 @@ const loadEnterpriseInfo = async () => {
       companyData.phone = formatValue(data.landline);
       companyData.email = formatValue(businessInfo.email || data.fax);
       companyData.address = formatValue(data.address);
-      companyData.availableAmount = salesInfo.remainingQuota || '0.00';
+      companyData.availableAmount = (parseInt(salesInfo.remainingQuota) + parseInt(salesInfo.temporaryQuota)).toFixed(2) || '0.00';
       companyData.creditAmount = salesInfo.creditAmount || '0.00';
     }
   } catch (error) {
@@ -213,8 +214,8 @@ const loadAnnouncementList = async () => {
 
 onMounted(() => {
   loadEnterpriseInfo();
-  loadAnnouncementList();
-  loadServicePersons();
+  // loadAnnouncementList();
+  // loadServicePersons();
 });
 
 // 加载专属服务人员

+ 22 - 3
src/views/enterprise/invoiceManage/index.vue

@@ -50,7 +50,7 @@
         <el-form-item label="发票抬头" prop="invoiceTitle"
           ><el-input v-model="form.invoiceTitle" placeholder="请输入发票抬头" disabled
         /></el-form-item>
-        <el-form-item label="纳税人识别号" prop="taxNo"><el-input v-model="form.taxNo" placeholder="请输入纳税人识别号" disabled /></el-form-item>
+        <el-form-item label="纳税人识别号" prop="taxNo"><el-input v-model="form.taxNo" placeholder="请输入纳税人识别号" /></el-form-item>
         <el-form-item label="开户银行" prop="bankName">
           <el-select v-model="form.bankName" placeholder="请选择开户银行" clearable filterable style="width: 100%">
             <el-option v-for="bank in bankList" :key="bank.id" :label="bank.bnName" :value="bank.bnName" />
@@ -72,6 +72,7 @@
 import { ref, reactive, onMounted } from 'vue';
 import { Phone, Search } from '@element-plus/icons-vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
+import { getEnterpriseInfo } from '@/api/pc/enterprise';
 import { getInvoiceList, addInvoice, updateInvoice, deleteInvoice } from '@/api/pc/enterprise';
 import { getBankList } from '@/api/pc/bank/bank';
 
@@ -80,11 +81,12 @@ const dialogTitle = ref('新增开票信息');
 const formRef = ref();
 const editingId = ref<number | null>(null);
 const total = ref(0);
+const invoiceTopic = ref('');
 
 const queryParams = reactive({ pageNum: 1, pageSize: 10, keyword: '', searchType: 'accountName' });
 const form = reactive({ invoiceTitle: '', taxNo: '', bankName: '', bankAccount: '', address: '', phone: '', bankId: null, bankCode: '' });
 const rules = {
-  invoiceTitle: [{ required: true, message: '请输入发票抬头', trigger: 'blur' }],
+  // invoiceTitle: [{ required: true, message: '请输入发票抬头', trigger: 'blur' }],
   taxNo: [{ required: true, message: '请输入纳税人识别号', trigger: 'blur' }],
   bankName: [{ required: true, message: '请输入开户银行', trigger: 'blur' }],
   bankAccount: [{ required: true, message: '请输入开户账户', trigger: 'blur' }],
@@ -119,6 +121,19 @@ const loadInvoiceList = async () => {
     ElMessage.error('加载发票列表失败');
   }
 };
+// 加载企业信息
+const loadEnterpriseInfo = async () => {
+  try {
+    const res = await getEnterpriseInfo();
+    if (res.code === 200 && res.data) {
+      const data = res.data;
+      invoiceTopic.value = data.invoiceTop;
+    }
+  } catch (error) {
+    console.error('加载企业信息失败:', error);
+    ElMessage.error('加载企业信息失败');
+  }
+};
 
 onMounted(() => {
   loadInvoiceList();
@@ -141,11 +156,12 @@ const resetForm = () => {
 const handleAdd = () => {
   resetForm();
   dialogTitle.value = '新增开票信息';
+  form.invoiceTitle = invoiceTopic.value || '';
   dialogVisible.value = true;
 };
 const handleEdit = (row: any) => {
   editingId.value = row.id;
-  form.invoiceTitle = row.invoiceTitle || '';
+  form.invoiceTitle = invoiceTopic.value || '';
   form.taxNo = row.taxId;
   form.bankName = row.bankName;
   form.bankAccount = row.bankAccount;
@@ -197,6 +213,9 @@ const handleDelete = (row: any) => {
     }
   );
 };
+onMounted(() => {
+  loadEnterpriseInfo();
+});
 </script>
 
 <style scoped lang="scss">

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

@@ -93,7 +93,7 @@
     </template>
 
     <template v-else>
-      <div class="status-tabs">
+      <!-- <div class="status-tabs">
         <div
           v-for="tab in complaintStatusTabs"
           :key="tab.key"
@@ -102,7 +102,7 @@
         >
           {{ tab.label }}
         </div>
-      </div>
+      </div> -->
 
       <div class="search-filter-bar">
         <div class="left">
@@ -379,6 +379,7 @@ const loadComplaintData = async () => {
   padding: 20px;
   background: #fff;
   min-height: 100%;
+  width: 100%;
 }
 .page-title {
   font-size: 16px;

+ 236 - 94
src/views/order/orderEvaluation/index.vue

@@ -21,19 +21,25 @@
 
     <div class="filter-bar">
       <span class="filter-label">下单部门</span>
-      <el-select v-model="queryParams.department" placeholder="请选择" style="width: 100px" clearable>
-        <el-option label="某某部门" value="某某部门" />
-      </el-select>
+      <el-tree-select
+        v-model="queryParams.department"
+        style="width: 100px"
+        :data="deptList"
+        :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
+        value-key="deptId"
+        placeholder="请选择"
+        check-strictly
+        :render-after-expand="false"
+        clearable
+      >
+      </el-tree-select>
       <span class="filter-label">状态</span>
       <el-select v-model="queryParams.status" placeholder="请选择" style="width: 100px" clearable>
-        <el-option label="已完成" value="completed" />
-        <el-option label="待收货" value="pending" />
+        <el-option v-for="dict in order_status" :key="dict.value" :label="dict.label" :value="dict.value" />
       </el-select>
       <span class="filter-label">支付方式</span>
       <el-select v-model="queryParams.payType" placeholder="请选择" style="width: 100px" clearable>
-        <el-option label="微信支付" value="wechat" />
-        <el-option label="支付宝" value="alipay" />
-        <el-option label="账期支付" value="credit" />
+        <el-option v-for="dict in pay_method" :key="dict.value" :label="dict.label" :value="dict.value" />
       </el-select>
     </div>
 
@@ -42,12 +48,19 @@
         <div class="order-header">
           <span class="order-time">{{ order.orderTime }}</span>
           <span class="order-no">订单号:{{ order.orderNo }}</span>
+          <el-button type="primary" link class="expand-btn" @click="order.expanded = !order.expanded"
+            >{{ order.expanded ? '收起' : '展开' }} <el-icon><ArrowRight /></el-icon
+          ></el-button>
           <el-button type="primary" link class="detail-btn" @click="handleViewDetail(order)"
             >订单详情 <el-icon><ArrowRight /></el-icon
           ></el-button>
         </div>
         <div class="product-list">
-          <div v-for="(product, productIndex) in order.products" :key="productIndex" class="product-row">
+          <div
+            v-for="(product, productIndex) in order.expanded ? order.products : order.products.slice(0, 1)"
+            :key="productIndex"
+            class="product-row"
+          >
             <div class="product-cell product-info-cell">
               <div class="product-image">
                 <el-image :src="product.image" fit="contain">
@@ -76,13 +89,15 @@
               <span class="status-text success">{{ order.statusText }}</span>
             </div>
             <div class="product-cell action-cell" v-if="productIndex === 0">
-              <el-button v-if="activeMainTab === 'pending'" type="primary" link size="small" @click="handleEvaluate(order)">评价</el-button>
-              <el-button v-if="activeMainTab === 'followUp'" type="primary" link size="small" @click="handleFollowUpEvaluate(order)">追评</el-button>
-              <el-button v-if="activeMainTab === 'evaluated'" type="primary" link size="small" @click="handleViewEvaluation(order)"
-                >查看评价</el-button
-              >
+              <el-button v-if="activeMainTab === '0'" type="primary" link size="small" @click="handleEvaluate(order)">评价</el-button>
+              <el-button v-if="activeMainTab === '1'" type="primary" link size="small" @click="handleFollowUpEvaluate(order)">追评</el-button>
+              <el-button v-if="activeMainTab === '2'" type="primary" link size="small" @click="handleViewEvaluation(order)">查看评价</el-button>
             </div>
           </div>
+          <!-- 显示更多商品提示 -->
+          <div v-if="!order.expanded && order.products.length > 1" class="more-products-hint">
+            该订单共 {{ order.products.length }} 件商品,点击展开查看全部
+          </div>
         </div>
       </div>
       <el-empty v-if="orderList.length === 0" description="暂无订单" />
@@ -125,98 +140,175 @@
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, computed } from 'vue';
+import { ref, reactive, computed, onMounted, getCurrentInstance, toRefs, ComponentInternalInstance, watch } from 'vue';
 import { useRouter } from 'vue-router';
 import { Search, Edit, ChatDotRound, Document, ArrowRight, Picture, Plus } from '@element-plus/icons-vue';
 import { ElMessage } from 'element-plus';
 import { PageTitle, StatusTabs } from '@/components';
+import { getOrderList, getOrderProducts, cancelOrder, deleteOrder, getEvalutionList, addOrderEvaluation } from '@/api/pc/enterprise/order';
+import type { OrderMain, OrderStatusStats } from '@/api/pc/enterprise/orderTypes';
+import { getDeptTree } from '@/api/pc/organization';
+import { DeptInfo } from '@/api/pc/organization/types';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { order_status, pay_method } = toRefs<any>(proxy?.useDict('order_status', 'pay_method'));
 
 const router = useRouter();
-const activeMainTab = ref('pending');
+const activeMainTab = ref('0');
 const evaluateDialogVisible = ref(false);
 const evaluateDialogTitle = ref('商品评价');
 const evaluateFormRef = ref();
 const currentOrder = ref<any>(null);
 const currentProduct = ref<any>(null);
 
+const deptList = ref([]);
+
 const mainTabs = [
-  { key: 'pending', label: '待评价', icon: Edit },
-  { key: 'followUp', label: '待追评', icon: ChatDotRound },
-  { key: 'evaluated', label: '已评价', icon: Document }
+  { key: '0', label: '待评价', icon: Edit },
+  { key: '1', label: '待追评', icon: ChatDotRound },
+  { key: '2', label: '已评价', icon: Document }
 ];
 
-const queryParams = reactive({ keyword: '', dateRange: null, department: '', status: '', payType: '' });
-const evaluateForm = reactive({ deliverGoods: 5, content: '' });
+const queryParams = reactive({ keyword: '', dateRange: null, department: '', status: '', payType: '', evaluationStatus: '' });
+const evaluateForm = reactive({ deliverGoods: 5, content: '', evaluationType: null });
 const evaluateRules = {
   deliverGoods: [{ required: true, message: '请选择评分', trigger: 'change' }],
   content: [{ required: true, message: '请输入评价内容', trigger: 'blur' }]
 };
 
-const pendingOrders = ref([
-  {
-    orderTime: '2025/12/05 16:15:06',
-    orderNo: '489283929283298392',
-    payAmount: '181',
-    payMethod: '微信支付',
-    statusText: '已完成',
-    products: [
-      { id: 1, name: '清华同方超越E500台式机电脑(i3-6100/4G/1T/19.5寸)', spec1: '规格02', spec2: '规格01', price: '181', quantity: 1, image: '' }
-    ]
-  },
-  {
-    orderTime: '2025/12/05 16:15:06',
-    orderNo: '489283929283298393',
-    payAmount: '181',
-    payMethod: '微信支付',
-    statusText: '已完成',
-    products: [
-      { id: 1, name: '清华同方超越E500台式机电脑(i3-6100/4G/1T/19.5寸)', spec1: '规格02', spec2: '规格01', price: '181', quantity: 1, image: '' }
-    ]
-  },
-  {
-    orderTime: '2025/12/05 16:15:06',
-    orderNo: '489283929283298394',
-    payAmount: '181',
-    payMethod: '微信支付',
-    statusText: '已完成',
-    products: [
-      { id: 1, name: '清华同方超越E500台式机电脑(i3-6100/4G/1T/19.5寸)', spec1: '规格02', spec2: '规格01', price: '181', quantity: 1, image: '' }
-    ]
-  }
-]);
+const pendingOrders = ref([]);
+const followUpOrders = ref([]);
+const evaluatedOrders = ref([]);
+
+const orderList = computed(() => {
+  if (activeMainTab.value === '0') return pendingOrders.value;
+  else if (activeMainTab.value === '1') return followUpOrders.value;
+  else return evaluatedOrders.value;
+});
+
+// 根据订单状态获取状态文本
+const getStatusText = (status: string) => {
+  const statusMap: Record<string, string> = {
+    '0': '待支付',
+    '1': '待确认',
+    '2': '待发货',
+    '3': '部分发货',
+    '4': '发货完成',
+    '5': '已完成',
+    '6': '已关闭',
+    '7': '已取消'
+  };
+  return statusMap[status] || status;
+};
+
+// 获取支付方式文本
+const getPayMethodText = (payType: string) => {
+  const payMethod = pay_method.value?.find((item: any) => item.value === payType);
+  return payMethod ? payMethod.label : payType;
+};
 
-const followUpOrders = ref([
-  {
-    orderTime: '2025/12/05 16:15:06',
-    orderNo: '489283929283298395',
-    payAmount: '181',
-    payMethod: '微信支付',
-    statusText: '已完成',
-    products: [
-      { id: 1, name: '清华同方超越E500台式机电脑(i3-6100/4G/1T/19.5寸)', spec1: '规格02', spec2: '规格01', price: '181', quantity: 1, image: '' }
-    ]
+// 加载订单商品
+const loadOrderProducts = async (orderId: number) => {
+  try {
+    const res = await getOrderProducts([orderId]);
+    if (res.code === 200 && res.rows) {
+      return res.rows.map((product: any) => ({
+        id: product.id,
+        name: product.productName || '',
+        spec1: product.productUnit || '',
+        spec2: product.productNo || '',
+        price: product.orderPrice || 0,
+        quantity: product.orderQuantity || 0,
+        image: product.productImage || ''
+      }));
+    }
+    return [];
+  } catch (error) {
+    console.error('加载订单商品失败:', error);
+    return [];
   }
-]);
+};
+
+// 获取订单列表
+const getorders = async () => {
+  try {
+    const params: any = {
+      pageNum: 1,
+      pageSize: 100
+    };
+
+    if (queryParams.keyword) params.orderNo = queryParams.keyword;
+    if (queryParams.dateRange && queryParams.dateRange.length === 2) {
+      params.beginTime = queryParams.dateRange[0];
+      params.endTime = queryParams.dateRange[1];
+    }
+    if (queryParams.department) params.department = queryParams.department;
+    if (queryParams.status) params.orderStatus = queryParams.status;
+    if (queryParams.payType) params.payType = queryParams.payType;
+
+    // 根据当前标签页设置评价状态
+    params.evaluationStatus = activeMainTab.value;
 
-const evaluatedOrders = ref([
-  {
-    orderTime: '2025/12/05 16:15:06',
-    orderNo: '489283929283298396',
-    payAmount: '181',
-    payMethod: '微信支付',
-    statusText: '已完成',
-    products: [
-      { id: 1, name: '清华同方超越E500台式机电脑(i3-6100/4G/1T/19.5寸)', spec1: '规格02', spec2: '规格01', price: '181', quantity: 1, image: '' }
-    ]
+    const res = await getEvalutionList(params);
+    if (res.code === 200 && res.rows) {
+      // 转换订单数据并加载商品信息
+      const orders = await Promise.all(
+        res.rows.map(async (order: any) => {
+          const products = await loadOrderProducts(order.orderId);
+          return {
+            orderId: order.orderId || 0,
+            orderTime: order.createTime || '',
+            orderNo: order.orderNo || '',
+            payAmount: order.payableAmount || 0,
+            payMethod: getPayMethodText(order.payType || ''),
+            statusText: getStatusText(order.orderStatus || ''),
+            orderStatus: order.orderStatus || '',
+            products: products,
+            expanded: false, // 默认收起状态
+            evaluationStatus: order.evaluationStatus || '0' // 评价状态
+          };
+        })
+      );
+
+      // 根据当前标签页设置对应的订单列表
+      if (activeMainTab.value === '0') {
+        pendingOrders.value = orders;
+      } else if (activeMainTab.value === '1') {
+        followUpOrders.value = orders;
+      } else {
+        evaluatedOrders.value = orders;
+      }
+    }
+  } catch (error) {
+    console.error('获取订单列表失败:', error);
+    ElMessage.error('获取订单列表失败');
   }
-]);
+};
 
-const orderList = computed(() => {
-  if (activeMainTab.value === 'pending') return pendingOrders.value;
-  else if (activeMainTab.value === 'followUp') return followUpOrders.value;
-  else return evaluatedOrders.value;
+// 监听标签页切换,重新获取数据
+watch(activeMainTab, () => {
+  getorders();
 });
 
+// 加载部门树
+const loadDeptTree = async () => {
+  try {
+    const res = await getDeptTree();
+    if (res.code === 200 && res.data) {
+      deptList.value = res.data;
+
+      if (Array.isArray(res.data)) {
+        const treeData = proxy?.handleTree<DeptInfo>(res.data, 'deptId', 'parentId');
+        deptList.value = treeData || res.data;
+      } else {
+        deptList.value = [];
+      }
+    }
+  } catch (error) {
+    console.error('获取部门树失败:', error);
+    ElMessage.error('获取部门树失败');
+  }
+};
+
 const handleViewDetail = (order: any) => {
   router.push(`/order/orderManage/detail/${order.orderId}`);
 };
@@ -226,14 +318,16 @@ const handleEvaluate = (order: any) => {
   evaluateDialogTitle.value = '商品评价';
   evaluateForm.deliverGoods = undefined;
   evaluateForm.content = '';
+  evaluateForm.evaluationType = 1;
   evaluateDialogVisible.value = true;
 };
 const handleFollowUpEvaluate = (order: any) => {
   currentOrder.value = order;
   currentProduct.value = order.products[0];
   evaluateDialogTitle.value = '追加评价';
-  evaluateForm.deliverGoods = 5;
+  evaluateForm.deliverGoods = undefined;
   evaluateForm.content = '';
+  evaluateForm.evaluationType = 2;
   evaluateDialogVisible.value = true;
 };
 const handleViewEvaluation = (order: any) => {
@@ -242,22 +336,58 @@ const handleViewEvaluation = (order: any) => {
 const handleSubmitEvaluate = async () => {
   const valid = await evaluateFormRef.value?.validate();
   if (!valid) return;
-  ElMessage.success('评价提交成功');
-  evaluateDialogVisible.value = false;
-  if (activeMainTab.value === 'pending') {
-    const index = pendingOrders.value.findIndex((o) => o.orderNo === currentOrder.value.orderNo);
-    if (index > -1) {
-      pendingOrders.value.splice(index, 1);
-      followUpOrders.value.push(currentOrder.value);
-    }
-  } else if (activeMainTab.value === 'followUp') {
-    const index = followUpOrders.value.findIndex((o) => o.orderNo === currentOrder.value.orderNo);
-    if (index > -1) {
-      followUpOrders.value.splice(index, 1);
-      evaluatedOrders.value.push(currentOrder.value);
+
+  try {
+    const submitData = {
+      orderId: currentOrder.value?.orderId,
+      productId: currentProduct.value?.id,
+      evaluationType: evaluateForm.evaluationType, // 1-评价 2-追评
+      deliverGoods: evaluateForm.deliverGoods,
+      content: evaluateForm.content,
+      // 图片上传暂时留空,后续可以添加
+      images: []
+    };
+
+    const res = await addOrderEvaluation(submitData);
+    if (res.code === 200) {
+      ElMessage.success('评价提交成功');
+      evaluateDialogVisible.value = false;
+
+      // 重新获取订单列表
+      await getorders();
+
+      // 如果需要手动更新本地数据(可选)
+      if (activeMainTab.value === '0') {
+        const index = pendingOrders.value.findIndex((o) => o.orderId === currentOrder.value.orderId);
+        if (index > -1) {
+          const order = pendingOrders.value.splice(index, 1)[0];
+          if (evaluateForm.evaluationType === '1') {
+            followUpOrders.value.push(order);
+          } else {
+            evaluatedOrders.value.push(order);
+          }
+        }
+      } else if (activeMainTab.value === '1') {
+        const index = followUpOrders.value.findIndex((o) => o.orderId === currentOrder.value.orderId);
+        if (index > -1) {
+          const order = followUpOrders.value.splice(index, 1)[0];
+          evaluatedOrders.value.push(order);
+        }
+      }
+    } else {
+      ElMessage.error(res.msg || '评价提交失败');
     }
+  } catch (error) {
+    console.error('评价提交失败:', error);
+    ElMessage.error('评价提交失败');
   }
 };
+
+// 页面加载时获取订单列表
+onMounted(() => {
+  loadDeptTree();
+  getorders();
+});
 </script>
 
 <style scoped lang="scss">
@@ -300,8 +430,12 @@ const handleSubmitEvaluate = async () => {
       .order-time {
         color: #333;
       }
-      .detail-btn {
+      .expand-btn {
         margin-left: auto;
+        margin-right: 10px;
+      }
+      .detail-btn {
+        margin-left: 0;
       }
     }
     .product-list {
@@ -404,6 +538,14 @@ const handleSubmitEvaluate = async () => {
         align-items: center;
       }
     }
+    .more-products-hint {
+      padding: 10px 15px;
+      background: #f5f5f5;
+      font-size: 12px;
+      color: #666;
+      text-align: center;
+      border-top: 1px solid #f0f0f0;
+    }
   }
 }
 .evaluate-product {

+ 333 - 83
src/views/order/orderManage/detail.vue

@@ -1,15 +1,23 @@
 <template>
   <div class="order-detail-container">
     <div class="page-header">
-      <el-button link @click="handleBack"><el-icon><ArrowLeft /></el-icon><span>返回</span></el-button>
+      <el-button link @click="handleBack"
+        ><el-icon><ArrowLeft /></el-icon><span>返回</span></el-button
+      >
       <span class="page-title">订单详情</span>
     </div>
     <div class="page-content">
       <!-- 订单进度 -->
       <div class="progress-section">
         <div class="progress-steps">
-          <div v-for="(step, index) in progressSteps" :key="index" :class="['step-item', { active: index <= currentStep, current: index === currentStep }]">
-            <div class="step-icon"><el-icon :size="24"><component :is="step.icon" /></el-icon></div>
+          <div
+            v-for="(step, index) in progressSteps"
+            :key="index"
+            :class="['step-item', { active: index <= currentStep, current: index === currentStep }]"
+          >
+            <div class="step-icon">
+              <el-icon :size="24"><component :is="step.icon" /></el-icon>
+            </div>
             <div class="step-info">
               <div class="step-title">{{ step.title }}</div>
               <div class="step-desc">{{ step.desc }}</div>
@@ -26,17 +34,36 @@
           <el-table-column label="商品信息" min-width="300">
             <template #default="{ row }">
               <div class="product-cell">
-                <div class="product-image"><el-image :src="row.image" fit="contain"><template #error><div class="image-placeholder"><el-icon :size="30" color="#ccc"><Picture /></el-icon></div></template></el-image></div>
-                <div class="product-info"><div class="product-name">{{ row.name }}</div><div class="product-spec">{{ row.spec1 }} {{ row.spec2 }}</div></div>
+                <div class="product-image">
+                  <el-image :src="row.image" fit="contain"
+                    ><template #error
+                      ><div class="image-placeholder">
+                        <el-icon :size="30" color="#ccc"><Picture /></el-icon></div></template
+                  ></el-image>
+                </div>
+                <div class="product-info">
+                  <div class="product-name">{{ row.name }}</div>
+                  <div class="product-spec">{{ row.spec1 }} {{ row.spec2 }}</div>
+                </div>
               </div>
             </template>
           </el-table-column>
-          <el-table-column prop="price" label="单价" width="100" align="center"><template #default="{ row }">¥{{ row.price }}</template></el-table-column>
-          <el-table-column label="数量" width="150" align="center"><template #default="{ row }"><el-input-number v-model="row.quantity" :min="1" size="small" disabled /></template></el-table-column>
-          <el-table-column prop="subtotal" label="小计" width="100" align="center"><template #default="{ row }">¥{{ row.subtotal }}</template></el-table-column>
-          <el-table-column label="操作" width="80" align="center"><template #default><el-button type="danger" link size="small">清除</el-button></template></el-table-column>
+          <el-table-column prop="price" label="单价" width="100" align="center"
+            ><template #default="{ row }">¥{{ row.price }}</template></el-table-column
+          >
+          <el-table-column label="数量" width="150" align="center"
+            ><template #default="{ row }"><el-input-number v-model="row.quantity" :min="1" size="small" disabled /></template
+          ></el-table-column>
+          <el-table-column prop="subtotal" label="小计" width="100" align="center"
+            ><template #default="{ row }">¥{{ row.subtotal }}</template></el-table-column
+          >
+          <el-table-column label="操作" width="80" align="center"
+            ><template #default><el-button type="danger" link size="small">清除</el-button></template></el-table-column
+          >
         </el-table>
-        <div class="product-summary">共{{ productList.length }}件商品 运费:¥{{ orderInfo.freight }} 共计<span class="total-price">¥{{ orderInfo.totalAmount }}</span></div>
+        <div class="product-summary">
+          共{{ productList.length }}件商品 运费:¥{{ orderInfo.freight }} 共计<span class="total-price">¥{{ orderInfo.totalAmount }}</span>
+        </div>
       </div>
       <!-- 收货地址 -->
       <div class="section">
@@ -51,23 +78,45 @@
       <div class="section">
         <div class="section-title"><i class="title-bar"></i>其他信息</div>
         <div class="info-table">
-          <div class="info-row"><span class="info-label">配送时间</span><span class="info-value">{{ orderInfo.deliveryTime }}</span></div>
-          <div class="info-row"><span class="info-label">采购事由</span><span class="info-value">{{ orderInfo.purchaseReason || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">费用类型</span><span class="info-value">{{ orderInfo.costType || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">订单备注</span><span class="info-value">{{ orderInfo.remark || '-' }}</span></div>
+          <div class="info-row">
+            <span class="info-label">配送时间</span><span class="info-value">{{ orderInfo.deliveryTime }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">采购事由</span><span class="info-value">{{ orderInfo.purchaseReason || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">费用类型</span><span class="info-value">{{ orderInfo.costType || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">订单备注</span><span class="info-value">{{ orderInfo.remark || '-' }}</span>
+          </div>
         </div>
       </div>
       <!-- 发票信息 -->
       <div class="section">
         <div class="section-title"><i class="title-bar"></i>发票信息</div>
         <div class="info-table">
-          <div class="info-row"><span class="info-label">发票类型</span><span class="info-value">{{ invoiceInfo.type || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">发票抬头</span><span class="info-value">{{ invoiceInfo.title || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">纳税人识别号</span><span class="info-value">{{ invoiceInfo.taxNo || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">注册地址</span><span class="info-value">{{ invoiceInfo.registerAddress || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">注册电话</span><span class="info-value">{{ invoiceInfo.registerPhone || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">开户银行</span><span class="info-value">{{ invoiceInfo.bankName || '-' }}</span></div>
-          <div class="info-row"><span class="info-label">银行账号</span><span class="info-value">{{ invoiceInfo.bankAccount || '-' }}</span></div>
+          <div class="info-row">
+            <span class="info-label">发票类型</span><span class="info-value">{{ invoiceInfo.type || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">发票抬头</span><span class="info-value">{{ invoiceInfo.title || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">纳税人识别号</span><span class="info-value">{{ invoiceInfo.taxNo || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">注册地址</span><span class="info-value">{{ invoiceInfo.registerAddress || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">注册电话</span><span class="info-value">{{ invoiceInfo.registerPhone || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">开户银行</span><span class="info-value">{{ invoiceInfo.bankName || '-' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="info-label">银行账号</span><span class="info-value">{{ invoiceInfo.bankAccount || '-' }}</span>
+          </div>
         </div>
       </div>
     </div>
@@ -75,27 +124,27 @@
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, onMounted } from 'vue'
-import { useRouter, useRoute } from 'vue-router'
-import { ArrowLeft, Document, Search, CircleCheck, Picture } from '@element-plus/icons-vue'
-import { getOrderInfo, getOrderProducts } from '@/api/pc/enterprise/order'
-import { getAddressInfo } from '@/api/pc/enterprise/address'
-import { getInvoiceList } from '@/api/pc/enterprise/invoice'
-import { ElMessage } from 'element-plus'
+import { ref, reactive, onMounted } from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import { ArrowLeft, Document, Search, CircleCheck, Picture } from '@element-plus/icons-vue';
+import { getOrderInfo, getOrderProducts } from '@/api/pc/enterprise/order';
+import { getAddressInfo } from '@/api/pc/enterprise/address';
+import { getInvoiceList } from '@/api/pc/enterprise/invoice';
+import { ElMessage } from 'element-plus';
 
-const router = useRouter()
-const route = useRoute()
-const orderId = ref<number | string>(0)
-const currentStep = ref(1)
-const loading = ref(false)
+const router = useRouter();
+const route = useRoute();
+const orderId = ref<number | string>(0);
+const currentStep = ref(1);
+const loading = ref(false);
 
 const progressSteps = ref([
   { title: '提交审核', icon: Document, desc: '采购一部提交订单审核', time: '2025/02/10 15:51:21' },
   { title: '审核中', icon: Search, desc: '采购一部提交订单审批', time: '2025/02/10 15:51:21' },
   { title: '审核完成', icon: CircleCheck, desc: '交易完成', time: '2025/02/10 15:51:21' }
-])
+]);
 
-const productList = ref<any[]>([])
+const productList = ref<any[]>([]);
 
 const orderInfo = reactive({
   freight: '0.00',
@@ -107,7 +156,7 @@ const orderInfo = reactive({
   purchaseReason: '',
   costType: '',
   remark: ''
-})
+});
 
 const invoiceInfo = reactive({
   type: '',
@@ -117,24 +166,24 @@ const invoiceInfo = reactive({
   registerPhone: '',
   bankName: '',
   bankAccount: ''
-})
+});
 
 // 加载订单详情
 const loadOrderDetail = async () => {
   try {
-    loading.value = true
-    const res = await getOrderInfo(orderId.value)
+    loading.value = true;
+    const res = await getOrderInfo(orderId.value);
     if (res.code === 200 && res.data) {
-      const order = res.data
+      const order = res.data;
       // 映射订单信息
-      orderInfo.freight = order.shippingFee || '0.00'
-      orderInfo.totalAmount = order.payableAmount || '0.00'
-      orderInfo.deliveryTime = order.expectedDeliveryTime || ''
-      orderInfo.purchaseReason = order.purchaseReason || ''
-      orderInfo.remark = order.remark || ''
+      orderInfo.freight = order.shippingFee || '0.00';
+      orderInfo.totalAmount = order.payableAmount || '0.00';
+      orderInfo.deliveryTime = order.expectedDeliveryTime || '';
+      orderInfo.purchaseReason = order.purchaseReason || '';
+      orderInfo.remark = order.remark || '';
 
       // 获取商品信息
-      const productsRes = await getOrderProducts([orderId.value])
+      const productsRes = await getOrderProducts([orderId.value]);
       if (productsRes.code === 200 && productsRes.rows) {
         productList.value = productsRes.rows.map((p: any) => ({
           id: p.id,
@@ -145,65 +194,266 @@ const loadOrderDetail = async () => {
           quantity: p.orderQuantity || 1,
           subtotal: (parseFloat(p.orderPrice || '0') * (p.orderQuantity || 1)).toFixed(2),
           image: p.productImage || ''
-        }))
+        }));
       }
 
       // 获取收货地址信息
       if (order.shippingAddressId) {
-        const addressRes = await getAddressInfo(order.shippingAddressId)
+        const addressRes = await getAddressInfo(order.shippingAddressId);
         if (addressRes.code === 200 && addressRes.data) {
-          orderInfo.address = addressRes.data.address || ''
-          orderInfo.receiverName = addressRes.data.consignee || ''
-          orderInfo.receiverPhone = addressRes.data.phone || ''
+          orderInfo.address = addressRes.data.address || '';
+          orderInfo.receiverName = addressRes.data.consignee || '';
+          orderInfo.receiverPhone = addressRes.data.phone || '';
         }
       }
 
       // 获取发票信息
-      const invoiceRes = await getInvoiceList({ pageNum: 1, pageSize: 1 })
+      const invoiceRes = await getInvoiceList({ pageNum: 1, pageSize: 1 });
       if (invoiceRes.code === 200 && invoiceRes.rows && invoiceRes.rows.length > 0) {
-        const invoice = invoiceRes.rows[0]
-        invoiceInfo.type = order.invoiceType || ''
-        invoiceInfo.title = order.customerName || ''
-        invoiceInfo.taxNo = invoice.taxId || ''
-        invoiceInfo.registerAddress = invoice.address || ''
-        invoiceInfo.registerPhone = invoice.phone || ''
-        invoiceInfo.bankName = invoice.bankName || ''
-        invoiceInfo.bankAccount = invoice.bankAccount || ''
+        const invoice = invoiceRes.rows[0];
+        invoiceInfo.type = order.invoiceType || '';
+        invoiceInfo.title = order.customerName || '';
+        invoiceInfo.taxNo = invoice.taxId || '';
+        invoiceInfo.registerAddress = invoice.address || '';
+        invoiceInfo.registerPhone = invoice.phone || '';
+        invoiceInfo.bankName = invoice.bankName || '';
+        invoiceInfo.bankAccount = invoice.bankAccount || '';
       }
     }
   } catch (error) {
-    console.error('加载订单详情失败:', error)
-    ElMessage.error('加载订单详情失败')
+    console.error('加载订单详情失败:', error);
+    ElMessage.error('加载订单详情失败');
   } finally {
-    loading.value = false
+    loading.value = false;
   }
-}
+};
 
 onMounted(() => {
-  const paramId = route.params.orderNo || route.params.id
-  console.log('路由参数:', route.params)
-  console.log('获取到的参数:', paramId)
+  const paramId = route.params.orderNo || route.params.id;
+  console.log('路由参数:', route.params);
+  console.log('获取到的参数:', paramId);
   // 直接使用字符串,不转换为数字,避免精度丢失
-  orderId.value = paramId as string
-  console.log('订单ID:', orderId.value)
+  orderId.value = paramId as string;
+  console.log('订单ID:', orderId.value);
   if (orderId.value) {
-    loadOrderDetail()
+    loadOrderDetail();
   } else {
-    console.error('订单ID无效,无法加载订单详情')
+    console.error('订单ID无效,无法加载订单详情');
   }
-})
-const handleBack = () => { router.push('/order/orderManage') }
+});
+const handleBack = () => {
+  router.push('/order/orderManage');
+};
 </script>
 
 <style scoped lang="scss">
-.order-detail-container { background: #f5f5f5; min-height: 100%; }
-.page-header { background: #fff; padding: 15px 20px; display: flex; align-items: center; gap: 10px; border-bottom: 1px solid #eee; .page-title { font-size: 16px; font-weight: bold; color: #333; } }
-.page-content { padding: 20px; }
-.progress-section { background: #fff; border-radius: 8px; padding: 30px 50px; margin-bottom: 15px; .progress-steps { display: flex; justify-content: space-between; position: relative; .step-item { display: flex; flex-direction: column; align-items: center; position: relative; flex: 1; .step-icon { width: 50px; height: 50px; border-radius: 8px; background: #f5f5f5; display: flex; align-items: center; justify-content: center; color: #999; margin-bottom: 10px; position: relative; z-index: 1; } &.active .step-icon { background: #e60012; color: #fff; } &.current .step-icon::after { content: ''; position: absolute; bottom: -5px; left: 50%; transform: translateX(-50%); width: 8px; height: 8px; border-radius: 50%; background: #e60012; } .step-info { text-align: center; .step-title { font-size: 14px; color: #999; margin-bottom: 5px; } .step-desc { font-size: 12px; color: #666; margin-bottom: 3px; } .step-time { font-size: 12px; color: #999; } } &.active .step-info .step-title { color: #333; } .step-line { position: absolute; top: 25px; left: calc(50% + 30px); width: calc(100% - 60px); height: 2px; background: #eee; &.active { background: #e60012; } } &:last-child .step-line { display: none; } } } }
-.section { background: #fff; border-radius: 8px; padding: 20px; margin-bottom: 15px; .section-title { font-size: 16px; font-weight: bold; display: flex; align-items: center; gap: 8px; margin-bottom: 15px; } }
-.title-bar { display: inline-block; width: 3px; height: 16px; background: #e60012; border-radius: 2px; }
-.product-cell { display: flex; align-items: center; gap: 15px; .product-image { width: 80px; height: 80px; background: #f5f5f5; border-radius: 4px; overflow: hidden; flex-shrink: 0; .el-image { width: 100%; height: 100%; } .image-placeholder { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; } } .product-info { .product-name { font-size: 14px; color: #333; margin-bottom: 5px; line-height: 1.4; } .product-spec { font-size: 12px; color: #999; } } }
-.product-summary { text-align: right; padding: 15px 0; font-size: 14px; color: #666; .total-price { font-size: 18px; font-weight: bold; color: #e60012; margin-left: 5px; } }
-.address-card { padding: 15px; border: 1px solid #eee; border-radius: 4px; .address-detail { font-size: 14px; color: #333; margin-bottom: 8px; } .address-name { font-size: 14px; color: #666; margin-bottom: 5px; } .address-phone { font-size: 14px; color: #666; } }
-.info-table { .info-row { display: flex; padding: 10px 0; border-bottom: 1px solid #f5f5f5; &:last-child { border-bottom: none; } .info-label { width: 100px; font-size: 14px; color: #999; flex-shrink: 0; } .info-value { flex: 1; font-size: 14px; color: #333; } } }
+.order-detail-container {
+  background: #f5f5f5;
+  min-height: 100%;
+}
+.page-header {
+  background: #fff;
+  padding: 15px 20px;
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  border-bottom: 1px solid #eee;
+  .page-title {
+    font-size: 16px;
+    font-weight: bold;
+    color: #333;
+  }
+}
+.page-content {
+  padding: 20px;
+}
+.progress-section {
+  background: #fff;
+  border-radius: 8px;
+  padding: 30px 50px;
+  margin-bottom: 15px;
+  .progress-steps {
+    display: flex;
+    justify-content: space-between;
+    position: relative;
+    .step-item {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      position: relative;
+      flex: 1;
+      .step-icon {
+        width: 50px;
+        height: 50px;
+        border-radius: 8px;
+        background: #f5f5f5;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        color: #999;
+        margin-bottom: 10px;
+        position: relative;
+        z-index: 1;
+      }
+      &.active .step-icon {
+        background: #e60012;
+        color: #fff;
+      }
+      &.current .step-icon::after {
+        content: '';
+        position: absolute;
+        bottom: -5px;
+        left: 50%;
+        transform: translateX(-50%);
+        width: 8px;
+        height: 8px;
+        border-radius: 50%;
+        background: #e60012;
+      }
+      .step-info {
+        text-align: center;
+        .step-title {
+          font-size: 14px;
+          color: #999;
+          margin-bottom: 5px;
+        }
+        .step-desc {
+          font-size: 12px;
+          color: #666;
+          margin-bottom: 3px;
+        }
+        .step-time {
+          font-size: 12px;
+          color: #999;
+        }
+      }
+      &.active .step-info .step-title {
+        color: #333;
+      }
+      .step-line {
+        position: absolute;
+        top: 25px;
+        left: calc(50% + 30px);
+        width: calc(100% - 60px);
+        height: 2px;
+        background: #eee;
+        &.active {
+          background: #e60012;
+        }
+      }
+      &:last-child .step-line {
+        display: none;
+      }
+    }
+  }
+}
+.section {
+  background: #fff;
+  border-radius: 8px;
+  padding: 20px;
+  margin-bottom: 15px;
+  .section-title {
+    font-size: 16px;
+    font-weight: bold;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    margin-bottom: 15px;
+  }
+}
+.title-bar {
+  display: inline-block;
+  width: 3px;
+  height: 16px;
+  background: #e60012;
+  border-radius: 2px;
+}
+.product-cell {
+  display: flex;
+  align-items: center;
+  gap: 15px;
+  .product-image {
+    width: 80px;
+    height: 80px;
+    background: #f5f5f5;
+    border-radius: 4px;
+    overflow: hidden;
+    flex-shrink: 0;
+    .el-image {
+      width: 100%;
+      height: 100%;
+    }
+    .image-placeholder {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+  .product-info {
+    .product-name {
+      font-size: 14px;
+      color: #333;
+      margin-bottom: 5px;
+      line-height: 1.4;
+    }
+    .product-spec {
+      font-size: 12px;
+      color: #999;
+    }
+  }
+}
+.product-summary {
+  text-align: right;
+  padding: 15px 0;
+  font-size: 14px;
+  color: #666;
+  .total-price {
+    font-size: 18px;
+    font-weight: bold;
+    color: #e60012;
+    margin-left: 5px;
+  }
+}
+.address-card {
+  padding: 15px;
+  border: 1px solid #eee;
+  border-radius: 4px;
+  .address-detail {
+    font-size: 14px;
+    color: #333;
+    margin-bottom: 8px;
+  }
+  .address-name {
+    font-size: 14px;
+    color: #666;
+    margin-bottom: 5px;
+  }
+  .address-phone {
+    font-size: 14px;
+    color: #666;
+  }
+}
+.info-table {
+  .info-row {
+    display: flex;
+    padding: 10px 0;
+    border-bottom: 1px solid #f5f5f5;
+    &:last-child {
+      border-bottom: none;
+    }
+    .info-label {
+      width: 100px;
+      font-size: 14px;
+      color: #999;
+      flex-shrink: 0;
+    }
+    .info-value {
+      flex: 1;
+      font-size: 14px;
+      color: #333;
+    }
+  }
+}
 </style>

+ 136 - 6
src/views/order/orderManage/index.vue

@@ -145,7 +145,7 @@
           >已勾选 <em>{{ selectedCount }}</em
           >/{{ totalOrders }}个订单 共计<em>¥{{ selectedAmount }}</em></span
         >
-        <el-button>复制订单号</el-button>
+        <el-button @click="copyOrderNo">复制订单号</el-button>
         <el-dropdown
           ><el-button
             >批量订单打印 <el-icon><ArrowDown /></el-icon></el-button
@@ -160,6 +160,40 @@
     </div>
     <!-- 分页 -->
     <TablePagination v-model:page="queryParams.pageNum" v-model:page-size="queryParams.pageSize" :total="total" @change="handleQuery" />
+
+    <el-dialog v-model="evaluateDialogVisible" :title="evaluateDialogTitle" width="600px">
+      <div class="evaluate-product">
+        <div class="product-image">
+          <el-image :src="currentProduct?.image" fit="contain">
+            <template #error
+              ><div class="image-placeholder">
+                <el-icon :size="30" color="#ccc"><Picture /></el-icon></div
+            ></template>
+          </el-image>
+        </div>
+        <div class="product-info">
+          <div class="product-name">{{ currentProduct?.name }}</div>
+          <div class="product-spec">{{ currentProduct?.spec1 }} {{ currentProduct?.spec2 }}</div>
+        </div>
+      </div>
+      <el-form ref="evaluateFormRef" :model="evaluateForm" :rules="evaluateRules" label-width="80px">
+        <el-form-item label="商品评分" prop="deliverGoods">
+          <el-rate v-model="evaluateForm.deliverGoods" :colors="['#e60012', '#e60012', '#e60012']" />
+        </el-form-item>
+        <el-form-item label="评价内容" prop="content">
+          <el-input v-model="evaluateForm.content" type="textarea" :rows="4" placeholder="请输入评价内容" maxlength="200" show-word-limit />
+        </el-form-item>
+        <el-form-item label="上传图片">
+          <el-upload action="#" list-type="picture-card" :auto-upload="false" :limit="5">
+            <el-icon><Plus /></el-icon>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="evaluateDialogVisible = false">取消</el-button>
+        <el-button type="danger" @click="handleSubmitEvaluate">提交评价</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -169,7 +203,7 @@ import { useRouter } from 'vue-router';
 import { Search, ArrowDown, Delete, Document, Clock, Box, CircleCheck, CircleClose, Picture } from '@element-plus/icons-vue';
 import type { CheckboxValueType } from 'element-plus';
 import { TablePagination } from '@/components';
-import { getOrderList, getOrderStatusStats, getOrderProducts, cancelOrder, deleteOrder } from '@/api/pc/enterprise/order';
+import { getOrderList, getOrderStatusStats, getOrderProducts, cancelOrder, deleteOrder, addOrderEvaluation } from '@/api/pc/enterprise/order';
 import type { OrderMain, OrderStatusStats } from '@/api/pc/enterprise/orderTypes';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { getDeptTree } from '@/api/pc/organization';
@@ -182,6 +216,17 @@ const activeTab = ref('all');
 const selectAll = ref(false);
 const loading = ref(false);
 
+const evaluateDialogVisible = ref(false);
+const evaluateDialogTitle = ref('商品评价');
+const evaluateFormRef = ref();
+const currentProduct = ref<any>(null);
+const currentOrder = ref<any>(null);
+
+const evaluateForm = reactive({ deliverGoods: 5, content: '', evaluationType: null });
+const evaluateRules = {
+  deliverGoods: [{ required: true, message: '请选择评分', trigger: 'change' }],
+  content: [{ required: true, message: '请输入评价内容', trigger: 'blur' }]
+};
 const deptList = ref([]);
 
 const statusTabs = [
@@ -201,8 +246,8 @@ watch(activeTab, (newTab) => {
   } else {
     // 将前端标签页key映射回后端状态值
     const tabToStatusMap: Record<string, string> = {
-      'preOrder': '1', // 待支付,待确认
-      'shipping': '2,3,4', // 待发货,部分发货,发货完成
+      'preOrder': '0', // 待支付
+      'shipping': '4', // 待发货,部分发货,发货完成
       'completed': '5', // 已完成
       'cancelled': '7' // 已关闭,已取消
     };
@@ -299,8 +344,8 @@ const fetchOrderList = async () => {
         id: order.id,
         orderTime: order.createTime,
         orderNo: order.orderNo,
-        orderPerson: order.userId, // 需要关联用户信息
-        department: order.customerId, // 需要关联部门信息
+        orderPerson: order.customerName, // 需要关联用户信息
+        department: order.createDeptName, // 需要关联部门信息
         payAmount: order.payableAmount || 0,
         freight: order.shippingFee || 0,
         status: mapBackendStatusToTabKey(order.orderStatus || ''),
@@ -405,6 +450,8 @@ const handleSelectAll = (val: CheckboxValueType) => {
     order.checked = !!val;
   });
 };
+
+const copyOrderNo = () => {};
 const handleOrderCheck = () => {
   selectAll.value = orderList.value.every((order) => order.checked);
 };
@@ -434,10 +481,54 @@ const handleAction = (action: string, order: any) => {
     case '查看详情':
       handleViewDetail(order);
       break;
+    case '评价':
+      handleEvaluate(order);
+      break;
     default:
       ElMessage.info(`${action}功能开发中`);
   }
 };
+
+const handleEvaluate = (order: any) => {
+  currentOrder.value = order;
+  currentProduct.value = order.products[0];
+  evaluateDialogTitle.value = '商品评价';
+  evaluateForm.deliverGoods = undefined;
+  evaluateForm.content = '';
+  evaluateForm.evaluationType = 1;
+  evaluateDialogVisible.value = true;
+};
+
+const handleSubmitEvaluate = async () => {
+  const valid = await evaluateFormRef.value?.validate();
+  if (!valid) return;
+
+  try {
+    const submitData = {
+      orderId: currentOrder.value?.orderId,
+      productId: currentProduct.value?.id,
+      evaluationType: evaluateForm.evaluationType, // 1-评价 2-追评
+      deliverGoods: evaluateForm.deliverGoods,
+      content: evaluateForm.content,
+      // 图片上传暂时留空,后续可以添加
+      images: []
+    };
+
+    const res = await addOrderEvaluation(submitData);
+    if (res.code === 200) {
+      ElMessage.success('评价提交成功');
+      evaluateDialogVisible.value = false;
+
+      // 重新获取订单列表
+      await getOrderList();
+    } else {
+      ElMessage.error(res.msg || '评价提交失败');
+    }
+  } catch (error) {
+    console.error('评价提交失败:', error);
+    ElMessage.error('评价提交失败');
+  }
+};
 const handleCancelOrder = async (order: any) => {
   try {
     await ElMessageBox.confirm('确定要取消该订单吗?', '提示', {
@@ -730,6 +821,45 @@ onMounted(() => {
     }
   }
 }
+.evaluate-product {
+  display: flex;
+  align-items: center;
+  gap: 15px;
+  padding: 15px;
+  background: #f9f9f9;
+  border-radius: 4px;
+  margin-bottom: 20px;
+  .product-image {
+    width: 60px;
+    height: 60px;
+    background: #fff;
+    border-radius: 4px;
+    overflow: hidden;
+    flex-shrink: 0;
+    .el-image {
+      width: 100%;
+      height: 100%;
+    }
+    .image-placeholder {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+  .product-info {
+    .product-name {
+      font-size: 14px;
+      color: #333;
+      margin-bottom: 5px;
+    }
+    .product-spec {
+      font-size: 12px;
+      color: #999;
+    }
+  }
+}
 :deep(.table-pagination) {
   flex-shrink: 0;
   margin-top: 15px;

+ 92 - 31
src/views/organization/staffManage/index.vue

@@ -23,20 +23,27 @@
       <div class="staff-list">
         <!-- 操作栏 -->
         <div class="action-bar">
-          <!-- <el-button type="danger" @click="handleAdd">+ 新增</el-button> -->
-          <el-button :disabled="selectedRows.length === 0" @click="handleBatchDelete">批量删除</el-button>
+          <el-input v-model="queryParams.keyword" placeholder="搜索员工姓名" style="width: 200px" clearable @keyup.enter="handleQuery">
+            <template #prefix
+              ><el-icon><Search /></el-icon
+            ></template>
+          </el-input>
+          <div class="action-buttons">
+            <el-button type="danger" @click="handleAdd">+ 新增</el-button>
+            <el-button :disabled="selectedRows.length === 0" @click="handleBatchDelete">批量删除</el-button>
+          </div>
         </div>
 
         <!-- 表格 -->
         <el-table :data="staffList" border @selection-change="handleSelectionChange">
           <el-table-column type="selection" width="50" align="center" />
-          <el-table-column prop="name" label="姓名" min-width="100" align="center" />
+          <el-table-column prop="contactName" label="姓名" min-width="100" align="center" />
           <el-table-column prop="phone" label="手机号" min-width="140" align="center" />
-          <el-table-column prop="role" label="角色" min-width="120" align="center" />
+          <el-table-column prop="roleName" label="角色" min-width="120" align="center" />
           <el-table-column prop="deptName" label="部门名称" min-width="120" align="center" />
           <el-table-column prop="status" label="状态" min-width="80" align="center">
             <template #default="{ row }">
-              <span :class="['status-text', row.status === '启用' ? 'active' : '']">{{ row.status }}</span>
+              <span :class="['status-text', row.status === '启用' ? 'active' : '']">{{ row.status == '0' ? '启用' : '禁用' }}</span>
             </template>
           </el-table-column>
           <el-table-column label="操作" width="100" align="center">
@@ -55,8 +62,8 @@
     <!-- 新增/编辑弹窗 -->
     <el-dialog v-model="dialogVisible" :title="dialogTitle" width="500px" destroy-on-close>
       <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px">
-        <el-form-item label="姓名" prop="name">
-          <el-input v-model="formData.name" placeholder="请输入姓名" />
+        <el-form-item label="姓名" prop="contactName">
+          <el-input v-model="formData.contactName" placeholder="请输入姓名" />
         </el-form-item>
         <el-form-item label="手机号" prop="phone">
           <el-input v-model="formData.phone" placeholder="请输入手机号" />
@@ -69,10 +76,11 @@
             node-key="deptId"
             placeholder="请选择部门"
             style="width: 100%"
+            @change="handleDeptChange"
           />
         </el-form-item>
-        <el-form-item label="角色" prop="role">
-          <el-select v-model="formData.role" placeholder="请选择角色" style="width: 100%">
+        <el-form-item label="角色" prop="roleId">
+          <el-select v-model="formData.roleId" placeholder="请选择角色" style="width: 100%" @change="handRoleChange">
             <el-option v-for="role in roleList" :key="role.roleId" :label="role.roleName" :value="role.roleId.toString()" />
           </el-select>
         </el-form-item>
@@ -92,11 +100,12 @@
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, computed } from 'vue';
+import { ref, reactive, computed, onMounted, getCurrentInstance, ComponentInternalInstance } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
+import { Search } from '@element-plus/icons-vue';
 import { PageTitle, TablePagination } from '@/components';
 import { DeptInfo } from '@/api/pc/organization/types';
-import { getDeptTree, getRoleList } from '@/api/pc/organization';
+import { getDeptTree, getRoleList, getContactList, addContact, updateContact, deleteContact } from '@/api/pc/organization';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const currentDeptId = ref<number | null>(null);
 const dialogVisible = ref(false);
@@ -104,21 +113,23 @@ const formRef = ref();
 const editingRow = ref<any>(null);
 const selectedRows = ref<any[]>([]);
 
-const queryParams = reactive({ pageNum: 1, pageSize: 10 });
-const total = ref(50);
+const queryParams = reactive({ pageNum: 1, pageSize: 10, deptId: null as number | null, keyword: '' });
+const total = ref(0);
 
 const deptTreeData = ref<DeptInfo[]>([]);
 
 const formData = reactive({
-  name: '',
+  contactName: '',
   phone: '',
   deptId: null as number | null,
-  role: '',
-  status: '启用'
+  deptName: '',
+  roleId: '',
+  roleName: '',
+  status: '0'
 });
 
 const formRules = {
-  name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+  contactName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
   phone: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
   deptId: [{ required: true, message: '请选择部门', trigger: 'change' }]
 };
@@ -152,7 +163,7 @@ const loadDeptTree = async () => {
 // 加载角色列表
 const loadRoleList = async () => {
   try {
-    const res = await getRoleList();
+    const res = await getRoleList(queryParams);
     if (res.code === 200 && res.data) {
       roleList.value = res.data;
     }
@@ -161,13 +172,52 @@ const loadRoleList = async () => {
   }
 };
 
+const handleDeptChange = (value: number) => {
+  const selectedDept = deptTreeData.value.find((item) => item.deptId === value);
+  if (selectedDept) {
+    formData.deptName = selectedDept.deptName;
+  }
+};
+
+const handRoleChange = (value: number) => {
+  const selectedRole = roleList.value.find((item) => item.roleId === value);
+  if (selectedRole) {
+    formData.roleName = selectedRole.roleName;
+  }
+};
+
+// 加载员工列表
+const loadContactList = async () => {
+  try {
+    const params: any = {
+      pageNum: queryParams.pageNum,
+      pageSize: queryParams.pageSize
+    };
+
+    if (queryParams.deptId) params.deptId = queryParams.deptId;
+    if (queryParams.keyword) params.keyword = queryParams.keyword;
+
+    const res = await getContactList(params);
+    if (res.code === 200) {
+      staffList.value = res.rows;
+      total.value = res.total || 0;
+    }
+  } catch (error) {
+    console.error('获取员工列表失败:', error);
+    ElMessage.error('获取员工列表失败');
+  }
+};
+
 const handleDeptClick = (data: any) => {
-  currentDeptId.value = data.id;
-  handleQuery();
+  currentDeptId.value = data.deptId;
+  queryParams.deptId = data.deptId;
+  queryParams.pageNum = 1;
+  loadContactList();
 };
 
 const handleQuery = () => {
-  // 根据选中的部门筛选人员
+  queryParams.pageNum = 1;
+  loadContactList();
 };
 
 const handleSelectionChange = (rows: any[]) => {
@@ -176,21 +226,21 @@ const handleSelectionChange = (rows: any[]) => {
 
 const handleAdd = () => {
   editingRow.value = null;
-  formData.name = '';
+  formData.contactName = '';
   formData.phone = '';
   formData.deptId = currentDeptId.value;
-  formData.role = '';
-  formData.status = '启用';
+  formData.roleId = '';
+  formData.status = '0';
   dialogVisible.value = true;
 };
 
 const handleEdit = (row: any) => {
   editingRow.value = row;
-  formData.name = row.name;
+  formData.contactName = row.contactName;
   formData.phone = row.phone;
-  formData.deptId = null;
-  formData.role = row.role;
-  formData.status = row.status;
+  formData.deptId = row.deptId;
+  formData.roleId = row.roleId;
+  formData.status = row.statusValue;
   dialogVisible.value = true;
 };
 
@@ -200,12 +250,13 @@ const handleBatchDelete = () => {
     cancelButtonText: '取消',
     type: 'warning'
   }).then(() => {
+    deleteContact(selectedRows.value.map((item) => item.id));
     ElMessage.success('删除成功');
   });
 };
 
 const handleDelete = (row: any) => {
-  ElMessageBox.confirm(`确定要删除"${row.name}"吗?`, '提示', {
+  ElMessageBox.confirm(`确定要删除"${row.contactName}"吗?`, '提示', {
     confirmButtonText: '确定',
     cancelButtonText: '取消',
     type: 'warning'
@@ -222,17 +273,21 @@ const handleSubmit = async () => {
   const valid = await formRef.value?.validate();
   if (!valid) return;
   if (editingRow.value) {
+    await updateContact(formData);
     ElMessage.success('编辑成功');
   } else {
+    await addContact(formData);
     ElMessage.success('新增成功');
   }
+  loadContactList();
   dialogVisible.value = false;
 };
 
-// 页面加载时获取部门树
+// 页面加载时获取部门树和员工列表
 onMounted(() => {
   loadDeptTree();
   loadRoleList();
+  loadContactList();
 });
 </script>
 
@@ -277,8 +332,14 @@ onMounted(() => {
     .action-bar {
       margin-bottom: 15px;
       display: flex;
-      justify-content: flex-end;
+      justify-content: space-between;
+      align-items: center;
       gap: 10px;
+
+      .action-buttons {
+        display: flex;
+        gap: 10px;
+      }
     }
 
     .status-text {

+ 0 - 75
src/views/reconciliation/billManage/index.vue

@@ -1,9 +1,7 @@
 <template>
   <div class="page-container">
     <PageTitle title="对账单管理" />
-
     <SearchBar :form="searchForm" :filters="filters" placeholder="对账编号" />
-
     <el-table v-loading="loading" :data="tableData" border style="width: 100%">
       <el-table-column prop="billNo" label="对账编号" min-width="130" align="center" />
       <el-table-column prop="billDate" label="对账日期" min-width="110" align="center">
@@ -49,7 +47,6 @@ import { ElMessage, ElMessageBox } from 'element-plus';
 import { PageTitle, SearchBar, TablePagination } from '@/components';
 import { getStatementList, confirmStatement } from '@/api/pc/enterprise/statement';
 import type { StatementOrder } from '@/api/pc/enterprise/statementTypes';
-import { getDictByType } from '@/api/pc/system/dict';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { invoice_issuance_status, statement_status, payment_status } = toRefs<any>(
@@ -140,81 +137,9 @@ const getDictLabel = (dictOptions: any[], value: string) => {
 };
 
 // 加载字典数据
-const loadDictData = async () => {
-  try {
-    // 加载对账状态
-    const statementRes = await getDictByType('statement_status');
-    if (statementRes.data) {
-      billStatusOptions.value = [
-        { label: '全部', value: '' },
-        ...statementRes.data.map((item) => ({
-          label: item.dictLabel,
-          value: item.dictValue
-        }))
-      ];
-      filters.value[0].options = billStatusOptions.value;
-
-      // 构建状态值到文本的映射
-      billStatusMap.value = statementRes.data.reduce(
-        (map, item) => {
-          map[item.dictValue] = item.dictLabel;
-          return map;
-        },
-        {} as Record<string, string>
-      );
-    }
-
-    // 加载开票状态
-    const invoiceRes = await getDictByType('invoice_issuance_status');
-    if (invoiceRes.data) {
-      invoiceStatusOptions.value = [
-        { label: '全部', value: '' },
-        ...invoiceRes.data.map((item) => ({
-          label: item.dictLabel,
-          value: item.dictValue
-        }))
-      ];
-      filters.value[1].options = invoiceStatusOptions.value;
-
-      // 构建状态值到文本的映射
-      invoiceStatusMap.value = invoiceRes.data.reduce(
-        (map, item) => {
-          map[item.dictValue] = item.dictLabel;
-          return map;
-        },
-        {} as Record<string, string>
-      );
-    }
-
-    // 加载支付状态
-    const payRes = await getDictByType('payment_status');
-    if (payRes.data) {
-      payStatusOptions.value = [
-        { label: '全部', value: '' },
-        ...payRes.data.map((item) => ({
-          label: item.dictLabel,
-          value: item.dictValue
-        }))
-      ];
-      filters.value[2].options = payStatusOptions.value;
-
-      // 构建状态值到文本的映射
-      payStatusMap.value = payRes.data.reduce(
-        (map, item) => {
-          map[item.dictValue] = item.dictLabel;
-          return map;
-        },
-        {} as Record<string, string>
-      );
-    }
-  } catch (error) {
-    console.error('加载字典数据失败:', error);
-  }
-};
 
 // 页面加载时获取数据
 onMounted(() => {
-  loadDictData();
   loadStatementList();
 });
 

+ 95 - 83
src/views/reconciliation/invoiceManage/index.vue

@@ -13,10 +13,7 @@
       </el-table-column>
       <el-table-column prop="billStatus" label="对账状态" min-width="90" align="center">
         <template #default="{ row }">
-          <span v-if="row.billStatus === '0'">待确认</span>
-          <span v-else-if="row.billStatus === '1'">已确认</span>
-          <span v-else-if="row.billStatus === '2'">已驳回</span>
-          <span v-else>-</span>
+          {{ getDictLabel(statement_status, row.billStatus) }}
         </template>
       </el-table-column>
       <el-table-column label="操作" width="100" align="center">
@@ -28,8 +25,12 @@
 
     <div class="bottom-bar">
       <div class="summary">
-        <span>已选择 <em>{{ selectedCount }}</em> 个对账单</span>
-        <span class="total">合计金额 <em>¥{{ totalAmount.toFixed(2) }}</em></span>
+        <span
+          >已选择 <em>{{ selectedCount }}</em> 个对账单</span
+        >
+        <span class="total"
+          >合计金额 <em>¥{{ totalAmount.toFixed(2) }}</em></span
+        >
         <el-button type="primary" :disabled="selectedCount === 0" @click="handleApplyInvoice">申请开票</el-button>
       </div>
     </div>
@@ -41,41 +42,42 @@
 </template>
 
 <script setup lang="ts">
-import { reactive, ref, computed, onMounted, watch } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { PageTitle, SearchBar, TablePagination } from '@/components'
-import { getStatementList } from '@/api/pc/enterprise/statement'
-import type { StatementOrder } from '@/api/pc/enterprise/statementTypes'
-import { getDictByType } from '@/api/pc/system/dict'
-
+import { reactive, ref, computed, onMounted, watch } from 'vue';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { PageTitle, SearchBar, TablePagination } from '@/components';
+import { getStatementList } from '@/api/pc/enterprise/statement';
+import type { StatementOrder } from '@/api/pc/enterprise/statementTypes';
+import { get } from 'http';
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { invoice_issuance_status, statement_status, payment_status } = toRefs<any>(
+  proxy?.useDict('invoice_issuance_status', 'statement_status', 'payment_status')
+);
 const searchForm = reactive({
   keyword: '',
   dateRange: [],
   invoiceStatus: ''
-})
+});
 
-const invoiceStatusOptions = ref([{ label: '全部', value: '' }])
+const invoiceStatusOptions = ref([{ label: '全部', value: '' }]);
 
-const filters = ref([
-  { field: 'invoiceStatus', label: '开票状态', options: invoiceStatusOptions.value }
-])
+const filters = ref([{ field: 'invoiceStatus', label: '开票状态', options: invoiceStatusOptions.value }]);
 
-const pagination = reactive({ page: 1, pageSize: 5, total: 0 })
-const tableData = ref<any[]>([])
-const loading = ref(false)
-const selectedRows = ref<any[]>([])
+const pagination = reactive({ page: 1, pageSize: 5, total: 0 });
+const tableData = ref<any[]>([]);
+const loading = ref(false);
+const selectedRows = ref<any[]>([]);
 
 // 加载对账单列表
 const loadStatementList = async () => {
   try {
-    loading.value = true
+    loading.value = true;
     const res = await getStatementList({
       pageNum: pagination.page,
       pageSize: pagination.pageSize,
       statementOrderNo: searchForm.keyword,
-      statementStatus: '1', // 只查询已确认的对账单
-      isInvoiceStatus: searchForm.invoiceStatus || '0' // 默认查询未开票的对账单
-    })
+      isInvoiceStatus: searchForm.invoiceStatus,
+      statementStatus: '2'
+    });
 
     if (res.code === 200 && res.rows) {
       tableData.value = res.rows.map((item: StatementOrder) => ({
@@ -83,94 +85,104 @@ const loadStatementList = async () => {
         billNo: item.statementOrderNo,
         billDate: item.statementDate,
         amount: parseFloat(item.amount as any) || 0,
-        billStatus: item.statementStatus
-      }))
-      pagination.total = res.total || 0
+        billStatus: item.statementStatus,
+        invoiceStatus: item.isInvoiceStatus,
+        payStatus: item.isPaymentStatus
+      }));
+      pagination.total = res.total || 0;
     }
   } catch (error) {
-    console.error('加载对账单列表失败:', error)
-    ElMessage.error('加载对账单列表失败')
+    console.error('加载对账单列表失败:', error);
+    ElMessage.error('加载对账单列表失败');
   } finally {
-    loading.value = false
+    loading.value = false;
   }
-}
+};
+
+const getDictLabel = (dictOptions: any[], value: string) => {
+  if (!dictOptions || !value) return value;
+  const dict = dictOptions.find((item) => item.value === value);
+  return dict ? dict.label : value;
+};
 
 // 监听分页变化
-watch(() => [pagination.page, pagination.pageSize], () => {
-  loadStatementList()
-})
+watch(
+  () => [pagination.page, pagination.pageSize],
+  () => {
+    loadStatementList();
+  }
+);
 
 // 监听搜索条件变化
-watch(() => [searchForm.keyword, searchForm.invoiceStatus], () => {
-  pagination.page = 1
-  loadStatementList()
-})
-
-// 加载字典数据
-const loadDictData = async () => {
-  try {
-    const res = await getDictByType('invoice_issuance_status')
-    if (res.data) {
-      invoiceStatusOptions.value = [
-        { label: '全部', value: '' },
-        ...res.data.map(item => ({
-          label: item.dictLabel,
-          value: item.dictValue
-        }))
-      ]
-      filters.value[0].options = invoiceStatusOptions.value
-    }
-  } catch (error) {
-    console.error('加载字典数据失败:', error)
+watch(
+  () => [searchForm.keyword, searchForm.invoiceStatus],
+  () => {
+    pagination.page = 1;
+    loadStatementList();
   }
-}
+);
+
+// // 加载字典数据
+// const loadDictData = async () => {
+//   try {
+//     const res = await getDictByType('invoice_issuance_status');
+//     if (res.data) {
+//       invoiceStatusOptions.value = [
+//         { label: '全部', value: '' },
+//         ...res.data.map((item) => ({
+//           label: item.dictLabel,
+//           value: item.dictValue
+//         }))
+//       ];
+//       filters.value[0].options = invoiceStatusOptions.value;
+//     }
+//   } catch (error) {
+//     console.error('加载字典数据失败:', error);
+//   }
+// };
 
 // 页面加载时获取数据
 onMounted(() => {
-  loadDictData()
-  loadStatementList()
-})
+  // loadDictData();
+  loadStatementList();
+});
 
 // 处理选择变化
 const handleSelectionChange = (selection: any[]) => {
-  selectedRows.value = selection
-}
+  selectedRows.value = selection;
+};
 
 // 计算选中数量
-const selectedCount = computed(() => selectedRows.value.length)
+const selectedCount = computed(() => selectedRows.value.length);
 
 // 计算总金额
 const totalAmount = computed(() => {
-  return selectedRows.value.reduce((sum, item) => sum + item.amount, 0)
-})
+  return selectedRows.value.reduce((sum, item) => sum + item.amount, 0);
+});
 
 const handleView = (row: any) => {
-  ElMessage.info(`查看对账单:${row.billNo}`)
-}
+  ElMessage.info(`查看对账单:${row.billNo}`);
+};
 
 const handleApplyInvoice = async () => {
   try {
-    const billNos = selectedRows.value.map(row => row.billNo).join('、')
-    await ElMessageBox.confirm(
-      `确定要为以下对账单申请开票吗?\n${billNos}`,
-      '提示',
-      {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }
-    )
+    const billNos = selectedRows.value.map((row) => row.billNo).join('、');
+    await ElMessageBox.confirm(`确定要为以下对账单申请开票吗?\n${billNos}`, '提示', {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning'
+    });
 
     // TODO: 调用申请开票接口
-    ElMessage.success('申请开票成功')
-    loadStatementList()
+    ElMessage.success('申请开票成功');
+    loadStatementList();
   } catch (error) {
     if (error !== 'cancel') {
-      console.error('申请开票失败:', error)
-      ElMessage.error('申请开票失败')
+      console.error('申请开票失败:', error);
+      ElMessage.error('申请开票失败');
     }
   }
-}
+};
 </script>
 
 <style scoped>