瀏覽代碼

Merge branch 'master' of http://8.152.4.3:3000/yp_web/yoe-shop-web

weixin_52219567 5 天之前
父節點
當前提交
044b79525b

+ 2 - 2
.env.production

@@ -15,7 +15,7 @@ VITE_APP_MONITOR_ADMIN = '/admin/applications'
 VITE_APP_SNAILJOB_ADMIN = '/snail-job'
 
 # 生产环境
-VITE_APP_BASE_API = 'https://apiyouyida.yoe365.com'
+VITE_APP_BASE_API = 'https://api1.yoe365.com'
 
 # 是否在打包时开启压缩,支持 gzip 和 brotli
 VITE_BUILD_COMPRESS = gzip
@@ -53,7 +53,7 @@ VITE_DOMAIN_PASSPORT = 'pass.yoe365.com'
 VITE_DOMAIN_SEARCH = 'search.yoe365.com'
 VITE_DOMAIN_ITEM = 'item.yoe365.com'
 VITE_DOMAIN_CART = 'cart.yoe365.com'
-VITE_DOMAIN_TRAD = 'trad.yoe365.com'
+VITE_DOMAIN_TRAD = 'tracl.yoe365.com'
 VITE_DOMAIN_PAYC = 'payc.yoe365.com'
 VITE_DOMAIN_ORDER = 'order.yoe365.com'
 VITE_DOMAIN_PLAN = 'plan.yoe365.com'

+ 18 - 0
src/api/home/index.ts

@@ -261,3 +261,21 @@ export function getHeaderNav(title: any) {
     }
   });
 }
+
+//品牌中心列表
+export function getBandCenterList(query: any) {
+  return request({
+    url: '/system/indexSystem/getBandCenterList',
+    method: 'get',
+    params: query
+  });
+}
+
+//首页横幅广告
+export function getHomeBannerAdList(query: any) {
+  return request({
+    url: '/system/indexSystem/getHomeBannerAdList',
+    method: 'get',
+    params: query
+  });
+}

+ 21 - 0
src/api/pc/cost/itemExpense.ts

@@ -42,3 +42,24 @@ export function deleteItemExpense(ids: number[]) {
     method: 'delete'
   });
 }
+
+/**
+ * 分项费用明细
+ */
+export function expenseDetail(expenseTypeId: string | number) {
+  return request({
+    url: `/customer/pcCustomerExpenseType/expenseDetail/${expenseTypeId}`,
+    method: 'get'
+  });
+}
+
+/**
+ * 充值额度
+ */
+export function rechargeLimit(data: any) {
+  return request({
+    url: '/customer/pcCustomerExpenseType/rechargeLimit',
+    method: 'post',
+    data: data
+  });
+}

+ 1 - 1
src/layout/components/nav.vue

@@ -117,7 +117,7 @@ onMounted(async () => {
 
 const initData = async () => {
   if (headerType.value == 'jdHeader') {
-    jdheaderCategoryList({ status: 1 }).then((res) => {
+    jdheaderCategoryList({ status: 1, pageSize: 10 }).then((res) => {
       if (res.code == 200) {
         document.documentElement.style.setProperty('--hover-nav2', res.rows.length > 0 ? res.rows[0].headerThemeColor || '#E7000B' : '#E7000B');
         res.rows.forEach((item: any) => {

+ 117 - 20
src/views/cost/itemExpense/manage.vue

@@ -6,44 +6,141 @@
     </div>
 
     <el-table :data="itemDetailList" border>
-      <el-table-column prop="" label="部门名称" min-width="200" />
+      <el-table-column prop="deptName" label="部门名称" min-width="200" />
       <el-table-column prop="status" label="状态" min-width="100" align="center">
         <template #default="{ row }">
-          <span :class="['status-text', row.status === '启用' ? 'active' : '']">{{ row.status == '0' ? '启用' : '禁用' }}</span>
+          <span :class="['status-text', row.status === '0' ? 'active' : '']">{{ row.status == '0' ? '启用' : '禁用' }}</span>
         </template>
       </el-table-column>
-      <el-table-column prop="" label="现有额度(年)" min-width="150" align="center">
-        <!-- <template #default="{ row }">
-          <span>{{ row.usedQuota || '0.00' }}</span>
-        </template> -->
+      <el-table-column prop="existingAmount" label="现有额度(年)" min-width="150" align="center">
+        <template #default="{ row }">¥{{ (Number(row.existingAmount) || 0).toLocaleString() }}</template>
       </el-table-column>
       <el-table-column prop="usedQuota" label="已用额度(年)" min-width="150" align="center">
-        <!-- <template #default="{ row }">
-          <span>{{ row.usedQuota || '0.00' }}</span>
-        </template> -->
+        <template #default="{ row }">¥{{ (Number(row.usedQuota) || 0).toLocaleString() }}</template>
       </el-table-column>
-      <el-table-column prop="usedQuota" label="剩余额度(年)" min-width="150" align="center">
-        <!-- <template #default="{ row }">
-          <span>{{ row.usedQuota || '0.00' }}</span>
-        </template> -->
+      <el-table-column prop="remainingAmount" label="剩余额度(年)" min-width="150" align="center">
+        <template #default="{ row }">¥{{ (Number(row.remainingAmount) || 0).toLocaleString() }}</template>
       </el-table-column>
       <el-table-column label="操作" width="100" align="center">
-        <!-- <template #default="{ row }"> </template> -->
+        <template #default="{ row }">
+          <el-button type="primary" link size="small" @click="handleRecharge(row)">充值额度</el-button>
+        </template>
       </el-table-column>
     </el-table>
+
+    <el-dialog v-model="rechargeVisible" title="充值额度" width="450px" @close="resetRechargeForm">
+      <el-form :model="rechargeForm" label-width="110px">
+        <el-form-item label="分项费用名称">
+          <el-input :model-value="expenseName" disabled />
+        </el-form-item>
+        <el-form-item label="充值部门">
+          <el-input :model-value="rechargeForm.deptName" disabled />
+        </el-form-item>
+        <el-form-item label="充值额度" required>
+          <el-input v-model="rechargeForm.amount" placeholder="请输入充值金额" type="number" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="rechargeVisible = false">取消</el-button>
+        <el-button type="primary" @click="handleRechargeSubmit" :loading="rechargeLoading">确定</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 <script setup lang="ts">
-import { defineComponent } from 'vue';
-import { useRouter } from 'vue-router';
-const itemDetailList = ref<any[]>([]);
+import { ref, reactive, onMounted } from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import { ElMessage } from 'element-plus';
+import { expenseDetail, rechargeLimit } from '@/api/pc/cost/itemExpense';
+
 const router = useRouter();
+const route = useRoute();
+const itemDetailList = ref<any[]>([]);
+
+const expenseName = ref('');
+const rechargeVisible = ref(false);
+const rechargeLoading = ref(false);
+const rechargeForm = reactive({
+  deptId: '',
+  deptName: '',
+  amount: ''
+});
+
+const handleRecharge = (row: any) => {
+  expenseName.value = row.expenseName || '';
+  rechargeForm.deptId = row.deptId || '';
+  rechargeForm.deptName = row.deptName || '';
+  rechargeForm.amount = '';
+  rechargeVisible.value = true;
+};
+
+const resetRechargeForm = () => {
+  rechargeForm.deptId = '';
+  rechargeForm.deptName = '';
+  rechargeForm.amount = '';
+};
+
+const handleRechargeSubmit = async () => {
+  if (!rechargeForm.amount || Number(rechargeForm.amount) <= 0) {
+    ElMessage.warning('请输入有效的充值金额');
+    return;
+  }
+  rechargeLoading.value = true;
+  try {
+    const res = await rechargeLimit({
+      deptId: rechargeForm.deptId,
+      recharge: Number(rechargeForm.amount)
+    });
+    if (res.code === 200 || res.code === 0) {
+      ElMessage.success('充值成功');
+      rechargeVisible.value = false;
+      loadDetail();
+    } else {
+      ElMessage.error(res.msg || '充值失败');
+    }
+  } catch (e) {
+    console.error('充值失败:', e);
+    ElMessage.error('充值失败');
+  } finally {
+    rechargeLoading.value = false;
+  }
+};
+
+const loadDetail = async () => {
+  const id = route.query.id as string;
+  if (!id) return;
+  try {
+    const res = await expenseDetail(id);
+    if (res.code === 200 || res.code === 0) {
+      const data = res.data || res.rows || [];
+      const list = Array.isArray(data) ? data : [data];
+      itemDetailList.value = list.map((item: any) => {
+        const existing = Number(item.existingAmount || item.creditAmount) || 0;
+        const used = Number(item.usedQuota || item.usedAmount) || 0;
+        return {
+          id: item.id,
+          deptId: item.deptId,
+          deptName: item.deptName || '',
+          expenseName: item.expenseName || '',
+          status: item.status ?? '',
+          existingAmount: existing,
+          usedQuota: used,
+          remainingAmount: existing - used
+        };
+      });
+    }
+  } catch (e) {
+    console.error('查询费用明细失败:', e);
+  }
+};
 
 const handleBack = () => {
-  router.push({
-    path: '/cost/itemExpense'
-  });
+  router.push({ path: '/cost/itemExpense' });
 };
+
+onMounted(() => {
+  loadDetail();
+});
 </script>
 <style scoped lang="scss">
 .page-container {

+ 8 - 10
src/views/home/index-dataDiy.vue

@@ -166,19 +166,19 @@
           <JDUserPanel :userInfo="userInfo" />
           <div class="purchase-classroom">
             <div class="classroom-header">
-              <span class="classroom-title">采购课堂</span>
+              <span class="classroom-title">企业公告</span>
               <span class="classroom-more"></span>
             </div>
-            <div class="classroom-content" @click="onPath('/solve/real?id=' + announcement.id)">
+            <div class="classroom-content" @click="onPath('/enterprise/messageNotice')">
               <div class="classroom-time">
                 <span class="c-year">{{ announcement.yearAndWeek?.yearField }}</span>
                 <span class="c-week">{{ announcement.yearAndWeek?.weekField }}</span>
               </div>
               <div class="classroom-info">
-                <p class="c-desc">{{ announcement.announcementTitle }}</p>
+                <p class="c-desc">{{ announcement.title }}</p>
               </div>
               <div class="classroom-cover">
-                <img :src="announcement.coverImage" alt="课程封面" />
+                <img :src="announcement.coverUrl" alt="公告封面" />
               </div>
             </div>
           </div>
@@ -213,7 +213,7 @@ import workbench6 from '@/assets/images/layout/workbench6.png';
 import workbench7 from '@/assets/images/layout/workbench7.png';
 import { cartStore } from '@/store/modules/cart';
 import { getWorkbenchMenuList } from '@/api/pc/system/index';
-import { getAnnouncementList } from '@/api/pc/system/announcement';
+import { getNewNotice } from '@/api/home/index-enterprise';
 const announcement = ref<any>({});
 const cartStoreData = cartStore();
 const cartCount = computed(() => cartStoreData.cartCount);
@@ -360,12 +360,10 @@ getInfo().then((res) => {
   }
 });
 
-getAnnouncementList({ pageNum: 1, pageSize: 1, isShow: 1 }).then((res) => {
+getNewNotice({}).then((res) => {
   if (res.code == 200) {
-    if (res.rows.length > 0) {
-      announcement.value = res.rows[0];
-      announcement.value.yearAndWeek = getYearAndWeek(announcement.value.createTime);
-    }
+    announcement.value = res.data || {};
+    announcement.value.yearAndWeek = getYearAndWeek(announcement.value.createTime);
   }
 });
 

+ 8 - 2
src/views/home/index.vue

@@ -48,7 +48,7 @@
     </div>
     <!-- <advert v-if="procureList.length > 0" :row="{ navlList: procureList, styleType: 1, aspectRatio: 393 / 220 }"></advert> -->
 
-    <el-image class="img-advertisement" :src="advertisement.url" @click="onPath(advertisement.path)" />
+    <el-image class="img-advertisement" :src="advertisement.imageUrl" @click="onPath(advertisement.link)" />
 
     <!-- 循环-商品楼层 -->
     <div v-for="(item1, index1) in homeList" :key="index1">
@@ -96,7 +96,8 @@ import {
   getClassificationFloorDetail2,
   getProjectCaseTitle,
   getProjectCaseList,
-  getHomeNav
+  getHomeNav,
+  getHomeBannerAdList
 } from '@/api/home/index';
 
 const headData = ref<any>({});
@@ -189,6 +190,11 @@ const getHead = async () => {
       });
     }
 
+    const datas7 = await getHomeBannerAdList({});
+    if (datas7.code == 200 && datas7.data.length > 0) {
+      advertisement.value = datas7.data[0];
+    }
+
     headData.value.show = true;
   } catch (error) {}
 };

+ 1 - 1
src/views/home/jdcomponents/JDUserPanel.vue

@@ -90,7 +90,7 @@
         <div class="c-h flex-between">
           <span class="class-title">企业公告</span>
         </div>
-        <div class="class-card flex-between">
+        <div class="class-card flex-between" @click="onPath('/enterprise/messageNotice')">
           <div class="class-left-info">
             <span class="week-tag">{{ formatWeek(noticeData.createTime) || '' }}</span>
             <p class="class-desc">{{ noticeData.title || '' }}</p>

+ 3 - 3
src/views/home/pccomponents/pages/brand.vue

@@ -24,7 +24,7 @@
             />
             <div :style="titleCss" class="bigBrand1 zi-hover">{{ item.title || '' }}</div>
             <div :style="subtitleCss" class="bigBrand2">
-              {{ item.subtitle || '' }}
+              {{ item.title || '' }}
             </div>
           </div>
         </template>
@@ -174,14 +174,14 @@ const subtitleCss = computed(() => {
         .bigBrand2 {
           font-weight: 400;
           font-size: 12px;
-          color: #364153;
+          color: #999;
           display: -webkit-box;
           -webkit-line-clamp: 2;
           line-clamp: 2;
           -webkit-box-orient: vertical;
           overflow: hidden;
           text-overflow: ellipsis;
-          text-align: left;
+          text-align: center;
           width: 100%;
         }
       }

+ 2 - 2
src/views/i/help.vue

@@ -44,7 +44,7 @@
     </div>
 
     <!-- 联系客服 -->
-    <div class="section-container">
+    <!-- <div class="section-container">
       <h2 class="section-title">联系客服</h2>
       <div class="contact-cards">
         <div class="contact-card">
@@ -68,7 +68,7 @@
           </div>
         </div>
       </div>
-    </div>
+    </div> -->
   </div>
 </template>
 

+ 12 - 1
src/views/organization/deptManage/index.vue

@@ -91,7 +91,7 @@
           只能对当期年度进行额度设置,往期年度,显示最后一日数据,无法充值额度。
         </div>
         <el-form-item v-if="formData.isLimit === '0'" label="分项费用类型" prop="expenseTypeId">
-          <el-select v-model="formData.expenseTypeId" placeholder="请选择" style="width: 100%">
+          <el-select v-model="formData.expenseTypeId" placeholder="请选择" style="width: 100%" @change="changeExpenseType">
             <el-option v-for="item in expenseTypeList" :key="item.id" :label="item.expenseName" :value="item.id" />
           </el-select>
           <!-- <el-button type="primary" link style="margin-left: 12px">查询其他分项费用情况</el-button> -->
@@ -341,6 +341,17 @@ const loadExpenseTypeList = async () => {
   }
 };
 
+const changeExpenseType = (val: any) => {
+  const item = expenseTypeList.value.find((i: any) => i.id === val);
+  if (item) {
+    const current = parseFloat(item.currentQuota) || 0;
+    const used = parseFloat(item.usedQuota) || 0;
+    formData.yearlyBudget = String(current);
+    formData.usedBudget = String(used);
+    formData.residueBudget = String(current - used);
+  }
+};
+
 // 页面加载时获取部门树
 onMounted(() => {
   loadDeptTree();

+ 11 - 4
src/views/search/brand.vue

@@ -1,8 +1,8 @@
 <template>
   <div class="search-pages">
     <div class="nav-bos">
-      <div v-for="(item, index) in navList" :key="index" class="data-list" @click="onPath(item.url)">
-        <el-image class="img" :src="item.imageUrl" />
+      <div v-for="(item, index) in navList" :key="index" class="data-list" @click="onPath(item.advertUrl)">
+        <el-image class="img" :src="item.coverImage" />
       </div>
     </div>
     <!-- 筛选 -->
@@ -62,13 +62,13 @@
 
 <script setup lang="ts">
 import { getBrandByCategoryList, getBrandPage } from '@/api/search/index';
-import { getProductCategoryTree } from '@/api/home/index';
+import { getProductCategoryTree, getBandCenterList } from '@/api/home/index';
 import { onPath } from '@/utils/siteConfig';
 import { Search } from '@element-plus/icons-vue';
 const total = ref(0);
 const dataList = ref<any>([]);
 const classifyList = ref<any>([]);
-const navList = ref<any>([{}, {}, {}, {}, {}]);
+const navList = ref<any>([]);
 
 const httpObj = ref<any>({
   categoryId: '',
@@ -128,6 +128,13 @@ const onName = () => {
   getList();
 };
 
+//热门方案列表
+getBandCenterList({}).then((res) => {
+  if (res.code == 200) {
+    navList.value = res.data;
+  }
+});
+
 onMounted(() => {
   getProductCategoryTree({ platform: 0 }).then((res) => {
     if (res.code == 200) {