فهرست منبع

Merge branch 'master' of http://110.41.163.243:9980/kd-aiot/kd-aiot-frontend-wt

yusheng 2 ماه پیش
والد
کامیت
82431c2657

+ 4 - 0
lib/vue-form-making-v3/src/components/VantGenerator/GenerateElementItem.vue

@@ -503,6 +503,7 @@
           @on-upload-error="handleOnUploadError"
           @on-upload-remove="handleOnUploadRemove"
           @on-upload-progress="handleOnUploadProgress"
+          @on-upload-local="handleOnUploadLocal"
           :on-select="handleOnUploadSelect"
         ></fm-vant-uploader>
       </template>
@@ -799,6 +800,9 @@ export default {
         return []
       }
     },
+    handleOnUploadLocal () {
+      this.$emit('on-upload-local', this.widget.model)
+    },
   }
 }
 </script>

+ 4 - 0
lib/vue-form-making-v3/src/components/VantGenerator/GenerateForm.vue

@@ -184,6 +184,7 @@
           :blanks="blanks"
           :display="displayFields"
           @input-change="onInputChange"
+          @on-upload-local="handleOnUploadLocal"
           :edit="edit"
           :remote-option="remoteOption"
           :platform="platform"
@@ -310,6 +311,9 @@ export default {
         })
       })
     },
+    handleOnUploadLocal (model) {
+      this.$emit('on-upload-local', model)
+    },
     getData (isValidate = true) {
       return new Promise((resolve, reject) => {
         if (isValidate) {

+ 6 - 0
lib/vue-form-making-v3/src/components/VantGenerator/GenerateFormItem.vue

@@ -31,6 +31,7 @@
       :is-group="isGroup"
       :group="group"
       :field-node="fieldNode ? fieldNode + '.' + widget.model : widget.model"
+      @on-upload-local="handleOnUploadLocal"
     >
       <template v-slot:[blank.name]="scope" v-for="blank in blanks">
         <slot :name="blank.name" :model="scope.model"></slot>
@@ -78,5 +79,10 @@ export default {
     GenerateElementItem
   },
   mixins: [generateFormItemMixin],
+  methods: {
+    handleOnUploadLocal (model) {
+      this.$emit('on-upload-local', model)
+    }
+  }
 }
 </script>

+ 27 - 5
lib/vue-form-making-v3/src/components/VantGenerator/components/Uploader.vue

@@ -85,7 +85,7 @@ const props = defineProps({
 
 })
 
-const emit = defineEmits(['update:modelValue', 'on-upload-success', 'on-upload-error', 'on-upload-remove'])
+const emit = defineEmits(['update:modelValue', 'on-upload-success', 'on-upload-error', 'on-upload-remove', 'on-upload-local'])
 
 const formContext = inject('formContext', {})
 
@@ -298,6 +298,10 @@ function beforeDelete (file) {
   }
   return true
 }
+
+function uploadClick () {
+  emit('on-upload-local')
+}
 </script>
 
 <template>
@@ -324,7 +328,7 @@ function beforeDelete (file) {
   ></van-uploader>
 
   <div v-else class="fm-uploader-wrapper">
-    <van-uploader
+    <!-- <van-uploader
       :max-count="limit"
       :disabled="disabled"
       :multiple="multiple"
@@ -342,9 +346,12 @@ function beforeDelete (file) {
       v-if="!readonly"
     >
       <van-button icon="plus" type="primary">上传文件</van-button>
-    </van-uploader>
+    </van-uploader> -->
+    <span class="fm-uploader-wrapper-badge">{{fileList.length || 0}}</span>
+    <van-button v-if="!readonly" type="primary" @click="uploadClick">{{disabled ? '查看文件' : '上传文件'}}</van-button>
 
-    <div class="fm-uploader-file-list" v-if="!isImage" :class="{'is-readonly': readonly}">
+
+    <!-- <div class="fm-uploader-file-list" v-if="!isImage" :class="{'is-readonly': readonly}">
       <van-cell v-for="item in fileList" :key="item.key" class="fm-uploader-file-item">
         <template #title>
           <van-icon name="file" size="20" />
@@ -362,7 +369,7 @@ function beforeDelete (file) {
           />
         </template>
       </van-cell>
-    </div>
+    </div> -->
   </div>
 
 </template>
@@ -370,6 +377,21 @@ function beforeDelete (file) {
 <style lang="scss" scoped>
 .fm-uploader-wrapper{
   width: 100%;
+  position: relative;
+}
+.fm-uploader-wrapper-badge {
+  position: absolute;
+  left: 82px;
+  top: -6px;
+  background: red;
+  width: 22px;
+  height: 18px;
+  border-radius: 50%;
+  color: white;
+  text-align: center;
+  line-height: 18px;
+  z-index: 100;
+  font-size: 12px;
 }
 .fm-uploader-file-list{
   margin-top: 10px;

+ 30 - 1
src/api/bpm/components/inspectionManage/index.js

@@ -1,6 +1,13 @@
 import request from '@/utils/request';
 import store from '@/store';
 import Vue from 'vue';
+import {
+  getMyPage,
+} from '@/api/mes/produceOrder/index.js';
+import {
+  getList as getInspectionWorkList
+} from '@/api/qms/inspectionWork/index.js';
+import { getPlanOrderList } from '@/api/warehouseManagement/inventory';
 
 /**
  * 查询量具送检信息
@@ -36,10 +43,32 @@ export async function getList(params) {
 // 我的工单统计
 export async function statistics(params) {
   const res = await request.get('/eam/PdaWorkOrder/statistics', { params });
+  const productionsRes = await getMyPage({
+    queryTermination: 0,
+    pageNum: 1,
+    size: 1,
+    statusList: [4, 5, 7],
+    workCenterIds: store.state.user.info.workCenterIds
+  })
+
+  const inspectionWorkRes = await getInspectionWorkList({
+    pageNum: 1,
+    size: 1,
+    currentLoginUserId: store.state.user.info.userId,
+    status: 0,
+  })
+
+  const workRes = await getPlanOrderList({
+    pageNum: 1,
+    size: 1,
+    executorId: store.state.user.info.userId,
+    status: 0,
+  })
+  const totalCount = res.data.data.total + productionsRes.count + inspectionWorkRes.count + workRes.count + 0
   if (res.data.code == 0) {
     store.dispatch('user/setMenuBadge', {
       path: '/tickets',
-      value: res.data.data.total || 0,
+      value: totalCount || 0,
       color: 'danger'
     });
     // console.log('-----statistics---user--------');

+ 8 - 0
src/api/bpm/task.js

@@ -371,3 +371,11 @@ export async function ccPage(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+
+export function withdrawTask(query) {
+  return request({
+    url: '/bpm/task/withdraw',
+    method: 'get',
+    params: query
+  });
+}

+ 3 - 2
src/views/bpm/collaborative/index.vue

@@ -923,7 +923,7 @@
         return this.$store.state.theme.styleResponsive;
       },
       columns() {
-        let list = this.formColumnList.map((item) => {
+        let list = this.formColumnList.filter(item => item.name && item.name != '自定义区域').map((item) => {
           return {
             prop: item.model,
             label: item.name,
@@ -1012,7 +1012,7 @@
         ];
       },
       deptColumns() {
-        let list = this.formColumnList.map((item) => {
+        let list = this.formColumnList.filter(item => item.name && item.name != '自定义区域').map((item) => {
           return {
             prop: item.model,
             label: item.name,
@@ -1209,6 +1209,7 @@
         this.params.formId = this.defaultTemplateList[0]?.id;
         let makingJson =
           JSON.parse(this.defaultTemplateList[0].formJson.makingJson) || {};
+          console.log('makingJson~~~', makingJson);
         this.formColumnList = makingJson.list;
         console.log(this.formColumnList);
       },

+ 14 - 5
src/views/bpm/handleTask/components/mesWorkOrderChecklist/detailDialog.vue

@@ -321,6 +321,20 @@
           }
         }
 
+        const noRemarkWhenFail = this.form.details.find(
+          (v) => v.isPass === 0 && !String(v.remark ?? '').trim()
+        );
+        if (noRemarkWhenFail) {
+          let msg = '审核结果为「否」时必须填写备注';
+          if (noRemarkWhenFail.checkType === CHECK_TYPE.SC) {
+            msg = '生产放行规则中,审核结果为「否」时必须填写备注';
+          } else if (noRemarkWhenFail.checkType === CHECK_TYPE.ZJ) {
+            msg = '质检放行规则中,审核结果为「否」时必须填写备注';
+          }
+          this.$message.warning(msg);
+          return false;
+        }
+
         const changeList = this.form.details
           .filter((v) => v.isPass !== v._originIsPass)
           .map((v) => ({
@@ -329,11 +343,6 @@
             remark: v.remark
           }));
 
-        if (changeList.some((v) => !v.remark?.trim())) {
-          this.$message.warning('请填写备注');
-          return false;
-        }
-
         return {
           formData: this.form,
           changeList

+ 3 - 3
src/views/bpm/handleTask/components/mesWorkOrderChecklist/submit.vue

@@ -108,9 +108,9 @@
       },
 
       async handleAudit(status) {
-        let { formData, changeList } = await this.getTableValue();
-
-        if (!changeList) return;
+        const tableRes = await this.getTableValue();
+        if (!tableRes) return;
+        const { formData, changeList } = tableRes;
 
         let variables = {
           pass: !!status,

+ 7 - 2
src/views/bpm/handleTask/components/saleOrder/invoiceConfirm/detailDialog.vue

@@ -56,7 +56,7 @@
               <fileMain v-model="detailData.sendFiles" type="view"></fileMain>
             </el-form-item>
             <el-form-item
-              label="回执附件:"
+              :label="clientEnvironmentId == 6 ? '契约锁签收回执:' : '回执附件:'"
               prop="repliedFiles"
               style="margin-bottom: 16px"
             >
@@ -98,7 +98,7 @@
             <el-form-item prop="orderNo" label="发货单编码:">
               {{ form.sendNo }}
             </el-form-item>
-            <el-form-item prop="replied" label="是否回执:">
+            <el-form-item prop="replied" :label="clientEnvironmentId == 6 ? '契约锁是否签收:' : '是否回执:'">
               {{ form.replied == 1 ? '是' : '否' }}
             </el-form-item>
 
@@ -573,6 +573,11 @@
         // });
       }
     },
+    computed: {
+      clientEnvironmentId() {
+        return this.$store.state.user.info.clientEnvironmentId;
+      },
+    },
     methods: {
       changeActive(item) {
         this.activeComp = item.key;

+ 154 - 127
src/views/bpm/message/index.vue

@@ -1,6 +1,5 @@
 <template>
   <div class="ele-body">
-
     <el-card shadow="never">
       <div class="filter-container">
         <el-form
@@ -24,8 +23,7 @@
               </el-form-item>
             </el-col>
 
-            <el-col
-              v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+            <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
               <el-form-item label="发送时间:" prop="createTime">
                 <el-date-picker
                   v-model="params.createTime"
@@ -39,7 +37,9 @@
                 />
               </el-form-item>
             </el-col>
-            <el-col v-bind="styleResponsive ? { lg: 12, md: 24 } : { span: 12 }">
+            <el-col
+              v-bind="styleResponsive ? { lg: 12, md: 24 } : { span: 12 }"
+            >
               <div class="ele-form-actions">
                 <el-button
                   type="primary"
@@ -56,9 +56,14 @@
         </el-form>
       </div>
       <ele-pro-table ref="table" :columns="columns" :datasource="datasource">
+        <!-- <template v-slot:templateContent="{ row }">
+          <el-link type="primary" :underline="false" @click="goDetail(row)">
+            {{ row.templateContent }}
+          </el-link>
+        </template> -->
+
         <!-- 操作列 -->
         <template v-slot:action="{ row }">
-
           <el-link
             type="primary"
             :underline="false"
@@ -72,151 +77,173 @@
             type="primary"
             :underline="false"
             icon="el-icon-view"
-            v-if="row.formPath"            
-            @click="handleAddOrEdit(row,row.formPath)"
+            v-if="row.formPath"
+            @click="handleAddOrEdit(row, row.formPath)"
           >
             处理
           </el-link>
-        
         </template>
-        <template v-slot:readStatus="{row}">
+        <template v-slot:readStatus="{ row }">
           <el-tag v-if="row.readStatus" type="success">{{ '已读' }}</el-tag>
           <el-tag v-else type="danger">{{ '未读' }}</el-tag>
-
         </template>
       </ele-pro-table>
     </el-card>
   </div>
 </template>
 <script>
+  import {
+    notifyMessagePageAPI,
+    updateNotifyMessageReadByIdAPI
+  } from '@/api/bpm/task';
+  import { mapGetters } from 'vuex';
 
-import {notifyMessagePageAPI, updateNotifyMessageReadByIdAPI} from "@/api/bpm/task";
-import {mapGetters} from "vuex";
-
-
-export default {
-  data() {
-    return {
-      addOrEditDialogFlag: false,
-      params: {
-        createTime: null,
-        readStatus: null,
-      },
-      columns: [
-        {
-          columnKey: 'index',
-          label: '序号',
-          type: 'index',
-          width: 55,
-          align: 'center',
-          showOverflowTooltip: true,
-          fixed: 'left'
+  export default {
+    data() {
+      return {
+        addOrEditDialogFlag: false,
+        params: {
+          createTime: null,
+          readStatus: null
         },
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
 
-        {
-          prop: 'templateContent',
-          label: '消息',
-          minWidth: '250',
-        },
-        {
-          prop: 'readStatus',
-          label: '状态',
-          width: '80',
-          align: "center",
-          slot:'readStatus',
-        },
-        {
-          prop: 'readTime',
-          label: '阅读时间',
-          width: '180',
-          align: "center",
-          showOverflowTooltip: true,
-        },
-        {
-          prop: 'templateNickname',
-          label: '发送人',
-          width: '150',
-          align: "center",
-        },
-        {
-          prop: 'createTime',
-          label: '发送时间',
-         width: '180',
-          align: "center",
-          showOverflowTooltip: true,
-        },
-        {
-          columnKey: 'action',
-          label: '操作',
-          width: 150,
-          align: 'center',
-          slot: 'action',
-          fixed: 'right'
-        }
-      ],
-      searchForm: {},
-      tableData: [],
-      size: 10,
-      page: 1,
-      total: 0
-    };
-  },
-  computed: {
-    ...mapGetters(['user']),
-    // 是否开启响应式布局
-    styleResponsive() {
-      return this.$store.state.theme.styleResponsive;
-    }
-  },
-  methods: {
-    //新增或修改模板
-    async handleAddOrEdit(row,formPath) {
-      await updateNotifyMessageReadByIdAPI([row.id]);
-      if(formPath){
-        window.history.pushState(null, '', formPath);
+          {
+            prop: 'templateContent',
+            label: '消息',
+            minWidth: '250',
+            slot: 'templateContent'
+          },
+          {
+            prop: 'readStatus',
+            label: '状态',
+            width: '80',
+            align: 'center',
+            slot: 'readStatus'
+          },
+          {
+            prop: 'readTime',
+            label: '阅读时间',
+            width: '180',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'templateNickname',
+            label: '发送人',
+            width: '150',
+            align: 'center'
+          },
+          {
+            prop: 'createTime',
+            label: '发送时间',
+            width: '180',
+            align: 'center',
+            showOverflowTooltip: true
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 150,
+            align: 'center',
+            slot: 'action',
+            fixed: 'right'
+          }
+        ],
+        searchForm: {},
+        tableData: [],
+        size: 10,
+        page: 1,
+        total: 0
+      };
+    },
+    computed: {
+      ...mapGetters(['user']),
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
       }
-      this.$refs.table.reload()
     },
-    reload(type) {
-      if (type == 'reset') {
-        this.params = {
-          createTime: null,
-          readStatus: null,
+    methods: {
+      //新增或修改模板
+      async handleAddOrEdit(row, formPath) {
+        await updateNotifyMessageReadByIdAPI([row.id]);
+        if (formPath) {
+          // 跨子系统跳转:使用 location.href 整页跳转
+          this.goDetail(formPath);
+          // window.location.href = formPath;
+          // return;
+        }
+        this.$refs.table.reload();
+      },
+      reload(type) {
+        if (type == 'reset') {
+          this.params = {
+            createTime: null,
+            readStatus: null
+          };
+        }
+        this.$refs.table.reload({ page: 1, where: this.params });
+      },
 
+      goDetail(formPath) {
+        if (!formPath) return;
+        // 获取当前子系统的路由 base 前缀
+        const routerBase = this.$router.options.base || '/';
+        // 判断目标路径是否属于当前子系统(以当前子系统 base 开头或不含 /page- 前缀)
+        const isCurrentApp =
+          formPath.startsWith(routerBase) || !formPath.startsWith('/page-');
+        if (isCurrentApp) {
+          // 本系统内跳转:去掉 base 前缀后使用 router.push
+          const innerPath = formPath.startsWith(routerBase)
+            ? formPath.slice(routerBase.length - 1)
+            : formPath;
+          this.$router.push(innerPath);
+        } else {
+          // 跨子系统跳转:使用 location.href 整页跳转,让主应用重新加载目标子系统
+          window.location.href = formPath;
         }
+      },
+
+      datasource({ page, where, limit, ...row }) {
+        return notifyMessagePageAPI({
+          ...where,
+          pageNum: page,
+          size: limit,
+          userId: this.user.info.userId
+        });
       }
-      this.$refs.table.reload({page: 1, where: this.params});
-    },
-    datasource({page, where, limit, ...row}) {
-      return notifyMessagePageAPI({
-        ...where,
-        pageNum: page,
-        size: limit,
-        userId: this.user.info.userId
-      });
-    },
-  }
-};
+    }
+  };
 </script>
 <style lang="scss" scoped>
-.app-container {
-  background: #f0f3f3;
-  min-height: calc(100vh - 84px);
-}
+  .app-container {
+    background: #f0f3f3;
+    min-height: calc(100vh - 84px);
+  }
 
-.zw-page-table {
-  background: #ffffff;
-  padding-top: 20px;
-}
+  .zw-page-table {
+    background: #ffffff;
+    padding-top: 20px;
+  }
 
-.pagination-wrap {
-  display: flex;
-  justify-content: flex-end;
-  padding: 10px 0;
-}
+  .pagination-wrap {
+    display: flex;
+    justify-content: flex-end;
+    padding: 10px 0;
+  }
 
-.table {
-  width: 100%;
-  margin-top: 10px;
-}
+  .table {
+    width: 100%;
+    margin-top: 10px;
+  }
 </style>

+ 46 - 12
src/views/bpm/myInitiatedProcesses/index.vue

@@ -86,13 +86,26 @@
         </template>
         <!-- 操作列 -->
         <template v-slot:action="{ row }">
-          <el-button
+          <!-- <el-button
             size="mini"
             type="text"
             icon="el-icon-edit"
             @click="handleAudit(row)"
           >详情</el-button
+          > -->
+
+          <el-popconfirm
+            class="ele-action"
+            title="确认撤回吗?"
+            @confirm="handleWithdraw(row)"
+            v-if="row.status == 1"
           >
+            <template v-slot:reference>
+              <el-link type="primary" :underline="false">
+                撤回
+              </el-link>
+            </template>
+          </el-popconfirm>
         </template>
       </ele-pro-table>
     </el-card>
@@ -103,7 +116,7 @@
 
 <script>
 import dictMixins from '@/mixins/dictMixins';
-import { getProcessInstancePage } from '@/api/bpm/task';
+import { getProcessInstancePage, withdrawTask } from '@/api/bpm/task';
 import {getDate} from "@/utils/dateUtils";
 // import detail from '@/views/bpm/processInstance/detail.vue';
 import detail from '@/views/bpm/done/detailDialog.vue'
@@ -207,16 +220,16 @@ export default {
         //   showOverflowTooltip: true,
         //   minWidth: 130
         // },
-        // {
-        //   columnKey: 'action',
-        //   label: '操作',
-        //   width: 230,
-        //   align: 'center',
-        //   resizable: false,
-        //   slot: 'action',
-        //   showOverflowTooltip: true,
-        //   fixed: 'right'
-        // }
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 230,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true,
+          fixed: 'right'
+        }
       ]
     };
   },
@@ -259,6 +272,27 @@ export default {
       row.processInstance = processInstance;
       this.$refs.detailRef.open(row);
     },
+    handleWithdraw(row) {
+      console.log(row,'row') 
+      console.log(row.businessId,'row.businessId')
+      const processDefinitionKey = row.processDefinitionId.split(':')[0]
+      withdrawTask({
+        processInstanceId: row.id,
+        businessId: row.businessId,
+        processDefinitionKey: processDefinitionKey,
+      }).then(res => {
+        console.log(res,'res')
+        if (res.data.code == 0) {
+          this.$message({
+            message: '撤回成功',
+            type: 'success'
+          });
+          this.reload();
+        }
+      }).catch(err => {
+     
+      })
+    },
     getTimelineItemType(result) {
       if (result === '通过') {
         return 'success';

+ 44 - 8
src/views/bpm/tickets/index.vue

@@ -35,6 +35,13 @@
   import inspectionWork from './inspectionWork';
   import productions from './productions';
   import work from './work';
+  import {
+    getMyPage,
+  } from '@/api/mes/produceOrder/index.js';
+  import {
+    getList
+  } from '@/api/qms/inspectionWork/index.js';
+  import { getPlanOrderList } from '@/api/warehouseManagement/inventory';
   export default {
     components: {
       patrolInspection,
@@ -90,26 +97,55 @@
       }
     },
     methods: {
-      setCount() {
-        statistics().then((data) => {
+      async setCount() {
+        const productionsRes = await getMyPage({
+          queryTermination: 0,
+          pageNum: 1,
+          size: 1,
+          statusList: [4, 5, 7],
+          workCenterIds: this.$store.state.user.info.workCenterIds
+        })
+
+        const inspectionWorkRes = await getList({
+          pageNum: 1,
+          size: 1,
+          currentLoginUserId: this.$store.state.user.info.userId,
+          status: 0,
+        })
+
+        const workRes = await getPlanOrderList({
+          pageNum: 1,
+          size: 1,
+          executorId: this.$store.state.user.info.userId,
+          status: 0,
+        })
+
+        const eamRes = await statistics()
+        console.log('productionsRes~~~', productionsRes);
+        // statistics().then((data) => {
           this.tabOptions = this.tabOptions.map((item) => {
             console.log(item);
             switch (item.key) {
               case 'maintenance':
-                return { ...item, count: data.maintenanceNum };
+                return { ...item, count: eamRes.maintenanceNum };
               case 'patrolInspection':
-                return { ...item, count: data.patrolInspection };
+                return { ...item, count: eamRes.patrolInspection };
               case 'delivery':
-                return { ...item, count: data.quantityNum };
+                return { ...item, count: eamRes.quantityNum };
               case 'repair':
-                return { ...item, count: data.repairsNum };
+                return { ...item, count: eamRes.repairsNum };
+              case 'productions':
+                return { ...item, count: productionsRes.count || 0 };
               case 'inspectionWork':
-                return { ...item, count: data.inspectionWork || 0 };
+                return { ...item, count: inspectionWorkRes.count || 0 };
+              case 'work':
+                return { ...item, count: workRes.count || 0 }; 
               default:
                 return item;
             }
           });
-        });
+          console.log('tabOptions~~~', this.tabOptions);
+        // });
       }
     }
   };

+ 3 - 1
src/views/bpm/tickets/inspectionWork/index.vue

@@ -688,11 +688,13 @@
           where.status = this.way == 'todo' ? 0 : 1;
         // }
 
-        return getList({
+        this.$emit('recount');
+        const res = await getList({
           ...where,
           pageNum: page,
           size: limit
         });
+        return res;
       },
       search(where) {
         this.$refs.table.reload({

+ 1 - 3
src/views/bpm/tickets/productions/index.vue

@@ -981,8 +981,6 @@
       /* 表格数据源 */
       async datasource({ page, limit, where, order }) {
         console.log(this.tabValue, '888');
-        let statusList = this.tabValue == 1 ? [4, 5, 7] : [this.tabValue];
-
         let params = {
           ...where,
           ...order,
@@ -1003,7 +1001,7 @@
         let res = await URL({ ...params });
 
         this.loadTaskNames(res.list);
-
+        this.$emit('recount');
         return res;
       },
 

+ 4 - 2
src/views/bpm/tickets/work/index.vue

@@ -173,10 +173,12 @@
         this.$refs.disposeDialogRef.open(row.id);
       },
       /* 表格数据源 */
-      datasource({ page, limit, where, order }) {
+      async datasource({ page, limit, where, order }) {
         where.status = this.way == 'todo' ? 0 : 2;
         where.executorId = this.userInfo.userId;
-        return getPlanOrderList({ pageNum: page, size: limit, ...where });
+        this.$emit('recount');
+        const res = await getPlanOrderList({ pageNum: page, size: limit, ...where });
+        return res;
       },
       async changeEnable(row) {
         const res = await putRoles(row);

+ 1 - 1
src/views/home/index.vue

@@ -485,7 +485,7 @@ export default {
             images.push(match[1]);
           }
           // 提取纯文本内容(去除 HTML 标签和空格)
-          const textContent = content.replace(/<[^>]+>/g, '').replace(/\s+/g, '').trim();
+          const textContent = content.replace(/<[^>]+>/g, '').replace(/&nbsp;/g, '').replace(/\s+/g, '').trim();
 
           return {
             id: item.id,