a4188f41f3bc981fe8fa92c253a1195b76be04dd..9d4f45939870dde9b59d354616d87536d6274ef1
2025-09-03 p-honggang.li
修改交易员确认
9d4f45 对比 | 目录
2025-09-03 p-honggang.li
Merge branch 'master' of http://xearth.cn:6600/r/web-manage/web-manage
f053c2 对比 | 目录
2025-09-03 p-honggang.li
修改配置
9577bf 对比 | 目录
1个文件已添加
12个文件已修改
192 ■■■■ 已修改文件
src/api/orderApi.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/pointsApi.ts 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/sysUser.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/workFlowApi.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.ts 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/orderWorkflow.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/approveManage/tradeApproval/list.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/layout/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productManage/productPriceViewer/index.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tradeManage/buyer/index.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tradeManage/confirm/index.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tradeManage/evaluate/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views_back/layout/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/orderApi.ts
@@ -123,7 +123,17 @@
      method: 'get'
    }) as ApiPromise
  },
  updateOrderStatusToIsEvaluate(orderId: string): ApiPromise {
    return createAxios({
      url: `${url}/status/isEvaluate`,
      method: 'post',
      params: {
        orderId
      }
    }) as ApiPromise
  },
  updateOrderStatusToNext(orderId: string): ApiPromise {
    return createAxios({
      url: `${url}/status/next`,
src/api/pointsApi.ts
@@ -99,7 +99,7 @@
  },
  // 使用专门的积分扣减接口
  deductPointsByFlow(userId: string, unitId: string, points: number, orderId: string, remark?: string, dataCategory?: string): ApiPromise {
  deductPointsByFlow(userId: string, unitId: string, points: number, orderId: string, remark?: string, dataCategory?: string, providerId?: String): ApiPromise {
    return createAxios({
      url: `${url}user/deduct`,  // 使用新的专门积分扣减接口
      method: 'post',
@@ -110,7 +110,8 @@
        orderId,
        remark: remark || `订单${orderId}交易扣减积分`,
        dataCategory: dataCategory || 'resource_transaction',
        dataType: 1               // 1表示消耗
        dataType: 1,               // 1表示消耗
        providerId: providerId
      },
    }) as ApiPromise
  },
src/api/sysUser.ts
@@ -26,6 +26,7 @@
    // 获取用户详情
    getUserdetail(data: object = {}): ApiPromise {
        return createAxios({
            baseURL: '/api',
            url: `${url}/detail`,
            headers: {
                'Content-Type': 'application/json;charset=UTF-8'
src/api/workFlowApi.ts
New file
@@ -0,0 +1,15 @@
import createAxios from '@/utils/axios'
const workFlowApi = {
  getWorkFlowParams(data: object = {}) : ApiPromise{
    return createAxios({
        baseURL: '/api',
        url: `/approval/templateRelation/relationByType`,
        headers: {
            'Content-Type': 'application/json;charset=UTF-8'
        },
        data: data
    }) as ApiPromise
  }
}
export default  workFlowApi
src/main.ts
@@ -11,17 +11,17 @@
// import pagination from '@/components/Pagination/index.vue'
import store from '@/stores' // pinia状态管理器全局调用
import directives from '@/directives/index'
import FcDesigner from '@form-create/designer';
import formCreate from '@form-create/element-ui'; // 引入 FormCreate
// import FcDesigner from '@form-create/designer';
// import formCreate from '@form-create/element-ui'; // 引入 FormCreate
const app = createApp(App)
app.use(store)
app.use(router)
app.use(ElementPlus)
app.use(directives)
app.use(FcDesigner);
app.use(FcDesigner.formCreate);
app.use(formCreate);
// app.use(FcDesigner);
// app.use(FcDesigner.formCreate);
// app.use(formCreate);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}
src/utils/orderWorkflow.ts
@@ -20,7 +20,8 @@
  AUTHORIZE = '授权',
  CONFIRM_TRADE = '交易确认',
  EVALUATE = '评价',
  CANCEL_ORDER = '取消订单'
  CANCEL_ORDER = '取消订单',
  COMPLETED = '已完成'
}
// 页面类型枚举
src/views/approveManage/tradeApproval/list.vue
@@ -820,12 +820,16 @@
    gap: 20px;
    align-items: center;
    overflow: hidden;
    .status-item{
      flex-direction: row-reverse;
    }
    .order-item {
      display: flex;
      align-items: center;
      gap: 8px;
      flex-shrink: 0;
      flex: 1;
      
      .label {
        color: #909399;
src/views/layout/index.vue
@@ -129,7 +129,7 @@
.content-wrapper {
  width: 100%;
  height: calc(100vh - 70px);
  height: calc(100vh);
  display: flex;
}
.content-wrapperall{
src/views/productManage/productPriceViewer/index.vue
@@ -357,6 +357,7 @@
import { useUserInfo } from '@/stores/modules/userInfo'
import { queryUserDetail } from '@/api/userInfo'
import productApi from '@/api/productApi'
import workFlowApi from '@/api/workFlowApi'
const route = useRoute()
@@ -831,16 +832,25 @@
      // 调用工作流接口发起审批流程,拿到流程实例ID后回写订单workflow_id
      try {
        // 根据是否包含协议明细,配置不同流程定义与业务Key(先用静态值占位)
        const processdefId = hasAGREEMENT ? 'Process_Agreement_Static' : 'Process_Points_Static'
        // const processdefId = hasAGREEMENT ? 'Process_Agreement_Static' : 'Process_Points_Static'
        const businessKey = hasAGREEMENT ? 'agreement_biz_key' : 'points_biz_key'
        const wfRes: any = await orderApi.startWorkflowAndComplete({
          processdefId,
          userid: String(currentUserId.value || ''),
          businessKey
        const type = hasAGREEMENT ? 'trade_agreement' : 'trade_point';
        // 获取工作流参数
        const  wkParamsRes: any = await workFlowApi.getWorkFlowParams({
          type: type,
          unitId: '1'
        })
        if (wfRes?.code === 200 && wfRes.data?.processinstId) {
          await orderApi.updateWorkflowId(data.orderId, wfRes.data.processinstId)
        if(wkParamsRes?.code === 200 && wkParamsRes.data?.processTemplateId){
          const wfRes: any = await orderApi.startWorkflowAndComplete({
            processdefId: wkParamsRes.data.processTemplateId,
            userid: String(currentUserId.value || ''),
            businessKey: businessKey
          })
          if (wfRes?.code === 200 && wfRes.data?.processinstId) {
            await orderApi.updateWorkflowId(data.orderId, wfRes.data.processinstId)
          }
        }
      } catch (e) {
        console.warn('启动工作流失败或更新workflow_id失败', e)
      }
src/views/tradeManage/buyer/index.vue
@@ -227,7 +227,7 @@
                            交易确认
                          </el-button>
                          <el-button
                            v-else-if="action.type === ActionType.EVALUATE"
                            v-else-if="action.type === ActionType.EVALUATE && row.parentOrder.isEvaluate === '未评价'"
                            type="primary"
                            link
                            size="small"
@@ -280,12 +280,10 @@
<script setup lang="ts">
import { onMounted, reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
import { Search, Refresh } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import orderApi from '@/api/orderApi'
import productApi from '@/api/productApi'
import { useUserInfo } from '@/stores/modules/userInfo'
import ProductOrderStatusDialog from '@/views/productManage/productOrderStatusDialog/index.vue'
import { OrderWorkflowController, OrderStatus, ActionType, PageType, StatusMapper } from '@/utils/orderWorkflow'
import { queryUserDetail } from '@/api/userInfo'
@@ -582,7 +580,8 @@
      status: uiStatus,
      statusName: order.orderStatus || '',
      orderStatus: StatusMapper.toUIStatus(order.orderStatus), // 转换为标准状态枚举
      workFlowId: order.workflowId || ''
      workFlowId: order.workflowId || '',
      isEvaluate: order.isEvaluate || ''
    }
    const subOrders: any[] = Array.isArray(order?.orderDetails)
      ? order.orderDetails.map((d: any, i: number) => ({
src/views/tradeManage/confirm/index.vue
@@ -240,6 +240,8 @@
import pointsApi from '@/api/pointsApi' // 新增积分API导入
import { useUserInfo } from '@/stores/modules/userInfo'
import createAxios from '@/utils/axios'
import productApi from '@/api/productApi'
import sysUserService from '@/api/sysUser'
const route = useRoute()
const router = useRouter()
@@ -300,6 +302,39 @@
    const statusName: string = data.orderStatus || ''
    const uiStatus = statusServerToUi[statusName] || 'INFO'
    // 根据产品id获取产品信息,更新头部展示
    try {
      if (data.productId) {
        const detailRes: any = await productApi.getProductById({ id: data.productId })
        if (detailRes?.code === 200 && detailRes.data) {
          // 用产品详情补全头信息
          data.productName = detailRes.data.name || data.productName
          data.providerName = detailRes.data.submissionUnit || data.providerName
          data.industry = detailRes.data.industrialChainName || data.industry
          data.productDesc = detailRes.data.describe || data.productDesc
          data.projectUnit = detailRes.data.importantAreaName || data.productDesc
          data.productType = detailRes.data.typeName || data.productDesc
        }
      }
    } catch (e) {
      // 忽略产品详情失败,不阻塞订单详情
    }
    // 获取用户信息
    try {
      const userRes: any = await sysUserService.getUserdetail({ userId: data.userId })
      if (userRes?.code === 200 && userRes.data) {
        // 用产品详情补全头信息
        data.unitName = userRes.data.unitName || data.unitName
        data.userName = userRes.data.name || data.userName
        data.userDept = userRes.data.departmentName || data.userDept
        data.userPhone = userRes.data.phone || data.userPhone
        data.userAccount = userRes.data.username || data.userAccount
      }
    }catch (e){
    }
    // 映射订单详情头部信息
    const head = {
      orderNo: data.orderId,
@@ -318,6 +353,7 @@
      projectUnit: data.projectUnit || '-',
      productType: data.productType || '-',
      productDesc: data.productDesc || '-',
      providerId: data.providerId || ''
    }
    // 明细项映射
@@ -405,37 +441,37 @@
    // 检查订单是否涉及积分扣减
    const hasPointsDeduction = detail.items && detail.items.some((item: any) => Number(item.pricePoint || 0) > 0)
    
    if (hasPointsDeduction) {
      // 计算需要扣减的积分总额
      const totalPointsToDeduct = detail.items.reduce((sum: number, item: any) => {
        return sum + (Number(item.pricePoint || 0) * Number(item.quantity || 0))
      }, 0)
      if (totalPointsToDeduct > 0) {
        // 获取当前用户积分余额
        try {
          const userPointsRes = await pointsApi.getUserPoints(userId)
          if (userPointsRes.code !== 200 || !userPointsRes.data) {
            ElMessage.error('获取积分余额失败')
            return
          }
          const currentPoints = userPointsRes.data.balance || 0
          if (currentPoints < totalPointsToDeduct) {
            ElMessage.error(`积分余额不足!当前积分:${currentPoints.toLocaleString()},需要积分:${totalPointsToDeduct.toLocaleString()}`)
            return
          }
          // 积分余额充足,继续执行
          console.log(`积分余额检查通过:当前${currentPoints},需要${totalPointsToDeduct}`)
        } catch (error) {
          console.error('获取积分余额失败:', error)
          ElMessage.error('获取积分余额失败,请重试')
          return
        }
      }
    }
    // if (hasPointsDeduction) {
    //   // 计算需要扣减的积分总额
    //   const totalPointsToDeduct = detail.items.reduce((sum: number, item: any) => {
    //     return sum + (Number(item.pricePoint || 0) * Number(item.quantity || 0))
    //   }, 0)
    //
    //   if (totalPointsToDeduct > 0) {
    //     // 获取当前用户积分余额
    //     try {
    //       const userPointsRes = await pointsApi.getUserPoints(userId)
    //       if (userPointsRes.code !== 200 || !userPointsRes.data) {
    //         ElMessage.error('获取积分余额失败')
    //         return
    //       }
    //
    //       const currentPoints = userPointsRes.data.balance || 0
    //
    //       if (currentPoints < totalPointsToDeduct) {
    //         ElMessage.error(`积分余额不足!当前积分:${currentPoints.toLocaleString()},需要积分:${totalPointsToDeduct.toLocaleString()}`)
    //         return
    //       }
    //
    //       // 积分余额充足,继续执行
    //       console.log(`积分余额检查通过:当前${currentPoints},需要${totalPointsToDeduct}`)
    //     } catch (error) {
    //       console.error('获取积分余额失败:', error)
    //       ElMessage.error('获取积分余额失败,请重试')
    //       return
    //     }
    //   }
    // }
    // 确认操作
    await ElMessageBox.confirm('确定要确认交易?', '确认操作', {
@@ -465,7 +501,8 @@
            totalPointsToDeduct, 
            orderId, 
            productNames || '订单交易扣减积分',  // 使用产品名称作为备注
            '积分交易'  // 数据类别
            '积分交易',  // 数据类别
             detail.providerId
          )
          if (!deductRes || deductRes.code !== 200) {
            ElMessage.error(deductRes?.msg || deductRes?.message || '积分扣减失败,交易确认终止')
src/views/tradeManage/evaluate/index.vue
@@ -862,8 +862,8 @@
    })
    if (result && result.code === 200) {
      // 更新订单状态进入下一个状态
      await orderApi.updateOrderStatusToNext(orderId)
      // 更新订单评价状态为已评价
      await orderApi.updateOrderStatusToIsEvaluate(orderId)
      ElMessage.success('评价提交成功')
      router.back()    
      evaluationLoading.value = false
src/views_back/layout/index.vue
@@ -118,7 +118,7 @@
.content-wrapper {
  width: 100%;
  height: calc(100vh - 70px);
  height: calc(100vh);
  display: flex;
}
.content-wrapperall{