Bläddra i källkod

feat(审批流程): 重构营销活动审批流程并添加智能审批记录管理

yz 2 månader sedan
förälder
incheckning
f28ec72d4d
2 ändrade filer med 272 tillägg och 76 borttagningar
  1. 196 61
      src/api/order/marketing-activity.js
  2. 76 15
      src/views/order/marketing-activity/index.vue

+ 196 - 61
src/api/order/marketing-activity.js

@@ -1,4 +1,4 @@
-import request from '@/router/axios';
+import request from "@/router/axios";
 
 /**
  * 营销活动查询参数类型定义
@@ -140,6 +140,31 @@ import request from '@/router/axios';
  */
 
 /**
+ * 审批记录修改参数类型定义
+ * @typedef {Object} ApprovalRecordUpdateParams
+ * @property {string|number} id - 审批记录ID
+ * @property {string|number} activityId - 活动ID
+ * @property {string} activityCode - 活动编码
+ * @property {number} approvalStatus - 审批状态 1-待审批 2-审批通过 3-审批拒绝
+ * @property {string} approvalRemark - 审批备注
+ * @property {string|number} approverId - 审批人ID
+ * @property {string} approverName - 审批人姓名
+ * @property {string} approvalTime - 审批时间
+ */
+
+/**
+ * 审批记录添加参数类型定义
+ * @typedef {Object} ApprovalRecordAddParams
+ * @property {string|number} activityId - 活动ID
+ * @property {string} activityCode - 活动编码
+ * @property {number} approvalStatus - 审批状态 1-待审批 2-审批通过 3-审批拒绝
+ * @property {string} approvalRemark - 审批备注
+ * @property {string|number} approverId - 审批人ID
+ * @property {string} approverName - 审批人姓名
+ * @property {string} approvalTime - 审批时间
+ */
+
+/**
  * 营销活动分页查询
  * @param {number} current - 当前页码
  * @param {number} size - 每页大小
@@ -147,68 +172,113 @@ import request from '@/router/axios';
  * @returns {Promise<ApiResponse<PageResult<MarketingActivityItem>>>} 分页查询结果
  */
 export const getList = (current, size, params = {}) => {
-  return request({
-    url: '/api/blade-factory/api/factory/marketing-activity',
-    method: 'get',
-    params: {
-      ...params,
-      current,
-      size
-    }
-  })
-}
+    return request({
+        url: "/api/blade-factory/api/factory/marketing-activity",
+        method: "get",
+        params: {
+            ...params,
+            current,
+            size
+        }
+    });
+};
 
 /**
  * 获取营销活动详情
  * @param {string|number} activityId - 活动ID
  * @returns {Promise<ApiResponse<MarketingActivityItem>>} 活动详情
  */
-export const getDetail = (activityId) => {
-  return request({
-    url: `/api/blade-factory/api/factory/marketing-activity/${activityId}`,
-    method: 'get'
-  })
-}
+export const getDetail = activityId => {
+    return request({
+        url: `/api/blade-factory/api/factory/marketing-activity/${activityId}`,
+        method: "get"
+    });
+};
 
 /**
  * 修改营销活动(主要用于审批操作)
  * @param {MarketingActivityForm} row - 活动数据
  * @returns {Promise<ApiResponse<boolean>>} 修改结果
  */
-export const update = (row) => {
-  return request({
-    url: '/api/blade-factory/api/factory/marketing-activity',
-    method: 'put',
-    data: row
-  })
-}
+export const update = row => {
+    return request({
+        url: "/api/blade-factory/api/factory/marketing-activity",
+        method: "put",
+        data: row
+    });
+};
 
 /**
  * 审批营销活动
  * @param {ApprovalParams} params - 审批参数
+ * @param {Object} userInfo - 当前用户信息
+ * @param {string|number} userInfo.userId - 用户ID
+ * @param {string} userInfo.userName - 用户姓名
  * @returns {Promise<ApiResponse<boolean>>} 审批结果
  */
-export const approve = async (params) => {
-  const { id, approvalStatus, approvalRemark } = params
-  
-  // 先获取活动详情
-  const detailRes = await getDetail(id)
-  if (!detailRes.data.success) {
-    throw new Error('获取活动详情失败')
-  }
-  
-  const activityData = detailRes.data.data
-  
-  // 构建更新数据
-  const updateData = {
-    ...activityData,
-    approvalStatus,
-    approvalRemark,
-    approvalTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
-  }
-  
-  return update(updateData)
-}
+export const approveWithSmartRecord = async (params, userInfo) => {
+    const { id, approvalStatus, approvalRemark } = params;
+
+    try {
+        // 先获取活动详情
+        const detailRes = await getDetail(id);
+        if (!detailRes.data.success) {
+            throw new Error("获取活动详情失败");
+        }
+
+        const activityData = detailRes.data.data;
+        const currentTime = new Date()
+            .toISOString()
+            .replace("T", " ")
+            .substring(0, 19);
+
+        // 构建更新数据
+        const updateData = {
+            ...activityData,
+            approvalStatus,
+            approvalRemark,
+            approvalTime: currentTime,
+            approverId: userInfo.userId,
+            approverName: userInfo.userName
+        };
+
+        // 执行审批更新
+        const updateResult = await update(updateData);
+
+        if (updateResult.data.success) {
+            // 审批成功后,智能保存审批记录
+            const approvalRecordData = {
+                activityId: activityData.id,
+                activityCode: activityData.activityCode,
+                approvalStatus,
+                approvalRemark,
+                approverId: userInfo.userId,
+                approverName: userInfo.userName,
+                approvalTime: currentTime
+            };
+
+            try {
+                const recordResult = await saveApprovalRecord(
+                    activityData.id,
+                    userInfo.userId,
+                    approvalRecordData
+                );
+
+                if (!recordResult.data.success) {
+                    console.warn("审批记录保存失败:", recordResult.data.msg);
+                }
+            } catch (recordError) {
+                console.error("保存审批记录失败:", recordError);
+                // 审批记录保存失败不影响主流程,只记录错误日志
+            }
+        }
+
+        return updateResult;
+    } catch (error) {
+        console.error("审批操作失败:", error);
+        throw error;
+    }
+};
 
 /**
  * 获取营销活动审批记录列表
@@ -218,25 +288,90 @@ export const approve = async (params) => {
  * @returns {Promise<ApiResponse<PageResult<ApprovalRecordItem>>>} 审批记录分页查询结果
  */
 export const getApprovalRecords = (current, size, activityId) => {
-  return request({
-    url: '/api/blade-factory/api/factory/activity-approval',
-    method: 'get',
-    params: {
-      current,
-      size,
-      activityId
-    }
-  })
-}
+    return request({
+        url: "/api/blade-factory/api/factory/activity-approval",
+        method: "get",
+        params: {
+            current,
+            size,
+            activityId
+        }
+    });
+};
 
 /**
  * 获取单条审批记录详情
  * @param {string|number} activityApprovalId - 审批记录ID
  * @returns {Promise<ApiResponse<ApprovalRecordItem>>} 审批记录详情
  */
-export const getApprovalRecordDetail = (activityApprovalId) => {
-  return request({
-    url: `/api/blade-factory/api/factory/activity-approval/${activityApprovalId}`,
-    method: 'get'
-  })
-}
+export const getApprovalRecordDetail = activityApprovalId => {
+    return request({
+        url: `/api/blade-factory/api/factory/activity-approval/${activityApprovalId}`,
+        method: "get"
+    });
+};
+
+/**
+ * 添加审批记录
+ * @param {ApprovalRecordAddParams} params - 审批记录参数
+ * @returns {Promise<ApiResponse<boolean>>} 添加结果
+ */
+export const addApprovalRecord = params => {
+    return request({
+        url: "/api/blade-factory/api/factory/activity-approval",
+        method: "post",
+        data: params
+    });
+};
+
+/**
+ * 修改审批记录
+ * @param {ApprovalRecordUpdateParams} params - 审批记录修改参数
+ * @returns {Promise<ApiResponse<boolean>>} 修改结果
+ */
+export const updateApprovalRecord = params => {
+    return request({
+        url: "/api/blade-factory/api/factory/activity-approval",
+        method: "put",
+        data: params
+    });
+};
+
+/**
+ * 保存审批记录(如果存在则修改,不存在则添加)
+ * @param {string|number} activityId - 活动ID
+ * @param {string|number} approverId - 审批人ID
+ * @param {ApprovalRecordAddParams} approvalData - 审批记录数据
+ * @returns {Promise<ApiResponse<boolean>>} 保存结果
+ */
+export const saveApprovalRecord = async (
+    activityId,
+    approverId,
+    approvalData
+) => {
+    try {
+        // 先查询是否已有该活动的审批记录
+        const recordsResponse = await getApprovalRecords(1, 100, activityId);
+
+        if (
+            recordsResponse.data.success &&
+            recordsResponse.data.data.records.length > 0
+        ) {
+            const existingRecord = recordsResponse.data.data.records[0];
+
+            const updateParams = {
+                ...approvalData,
+                id: existingRecord.id,
+                approverId: existingRecord.approverId
+            };
+            return await updateApprovalRecord(updateParams);
+        } else {
+            // 如果查询失败或没有记录,则添加新记录
+            return await addApprovalRecord(approvalData);
+        }
+    } catch (error) {
+        console.error("保存审批记录失败:", error);
+        // 如果查询失败,尝试添加新记录
+        return await addApprovalRecord(approvalData);
+    }
+};

+ 76 - 15
src/views/order/marketing-activity/index.vue

@@ -228,7 +228,16 @@
 </template>
 
 <script>
-import { getList, getDetail, update, approve, getApprovalRecords } from '@/api/order/marketing-activity'
+import {
+  getList,
+  getDetail,
+  update,
+  approveWithSmartRecord,
+  getApprovalRecords,
+  addApprovalRecord,
+  updateApprovalRecord,
+  saveApprovalRecord
+} from '@/api/order/marketing-activity'
 import { mapGetters } from 'vuex'
 
 /**
@@ -528,7 +537,7 @@ export default {
   },
 
   computed: {
-    ...mapGetters(['permission']),
+    ...mapGetters(['permission', 'userInfo']),
 
     /**
      * 选中的ID列表
@@ -687,29 +696,47 @@ export default {
     },
 
     /**
-     * 提交审批
-     * @returns {Promise<void>}
+     * 提交审批(智能审批记录管理)
      */
     async submitApproval() {
       try {
-        await this.$refs.approvalForm.validate()
+        // 表单验证
+        const valid = await this.$refs.approvalForm.validate()
+        if (!valid) {
+          return
+        }
 
         this.approvalDialog.loading = true
 
-        await approve({
+        // 构建审批参数
+        const approvalParams = {
           id: this.approvalForm.id,
           approvalStatus: this.approvalForm.approvalStatus,
           approvalRemark: this.approvalForm.approvalRemark
-        })
+        }
 
-        this.$message.success('审批操作成功')
-        this.approvalDialog.visible = false
-        await this.onLoad(this.page)
-      } catch (error) {
-        if (error !== false) { // 表单验证失败时不显示错误
-          console.error('审批操作失败:', error)
-          this.$message.error('审批操作失败,请稍后重试')
+        // 获取当前用户信息
+        const currentUserInfo = {
+          userId: this.userInfo.user_id || this.userInfo.userId,
+          userName: this.userInfo.user_name || this.userInfo.userName || this.userInfo.name
         }
+
+        // 执行智能审批操作(包含智能审批记录管理)
+        const response = await approveWithSmartRecord(approvalParams, currentUserInfo)
+
+        if (response.data.success) {
+          this.$message.success('审批操作成功')
+          this.approvalDialog.visible = false
+          this.resetApprovalDialog()
+
+          // 刷新列表数据
+          await this.onLoad(this.page)
+        } else {
+          this.$message.error(response.data.msg || '审批操作失败')
+        }
+      } catch (error) {
+        console.error('审批操作失败:', error)
+        this.$message.error('审批操作失败,请稍后重试')
       } finally {
         this.approvalDialog.loading = false
       }
@@ -929,7 +956,41 @@ export default {
       } finally {
         this.loading = false
       }
-    }
+    },
+
+    /**
+     * 手动保存审批记录(用于特殊场景)
+     * @param {string|number} activityId - 活动ID
+     * @param {Object} approvalData - 审批数据
+     */
+    async handleSaveApprovalRecord(activityId, approvalData) {
+      try {
+        // 获取当前用户信息
+        const currentUserInfo = {
+          userId: this.userInfo.user_id || this.userInfo.userId,
+          userName: this.userInfo.user_name || this.userInfo.userName || this.userInfo.name
+        }
+
+        const response = await saveApprovalRecord(
+          activityId,
+          currentUserInfo.userId,
+          approvalData
+        )
+
+        if (response.data.success) {
+          this.$message.success('审批记录保存成功')
+          // 如果审批记录弹窗是打开的,刷新审批记录列表
+          if (this.approvalRecordsDialog.visible) {
+            await this.loadApprovalRecords()
+          }
+        } else {
+          this.$message.error(response.data.msg || '审批记录保存失败')
+        }
+      } catch (error) {
+        console.error('保存审批记录失败:', error)
+        this.$message.error('保存审批记录失败,请稍后重试')
+      }
+    },
   },
 
   /**