瀏覽代碼

转件功能封装和通知公告角标后台接口实现

songxy 1 年之前
父節點
當前提交
e9c5669002

+ 2 - 2
client_h5/package.json

@@ -16,14 +16,14 @@
   },
   "dependencies": {
     "axios": "^1.6.8",
+    "dayjs": "^1.11.11",
     "dingtalk-jsapi": "^3.0.33",
     "moment": "^2.30.1",
     "pinia": "^2.1.7",
     "qs": "^6.12.1",
     "vant": "^4.8.11",
     "vue": "^3.4.19",
-    "vue-router": "^4.2.5",
-    "dayjs": "^1.11.10"
+    "vue-router": "^4.2.5"
   },
   "devDependencies": {
     "@types/node": "^20.11.20",

+ 34 - 6
client_h5/src/components/flowForm.vue

@@ -94,7 +94,10 @@
 </template>
 
 <script setup lang="ts">
-import { formatDate } from "@/utils/common";
+import { showNotify } from 'vant';
+
+import { formatDate, jsonToFormData } from "@/utils/common";
+import { FlowDTO, getNextActivity } from "@/service/flow";
 import { getTemplateOpinionListByFlowInstanceId, getOpinionListByFlowInstanceId } from '@/service/flow';
 
 defineOptions({
@@ -110,12 +113,13 @@ const emit = defineEmits<{
 }>()
 const route = useRoute();
 const tabs = ref<{
-  title: string
+  title?: string
 }[]>([{}])
 const currentActive = ref<string>('基础信息')
-const { flowInstanceId, activityInstanceId } = route.query as {
+const { flowInstanceId, activityInstanceId, participant } = route.query as {
   flowInstanceId: string
   activityInstanceId: string
+  participant: string
 }
 const currentOpinion = ref({
   id: '',
@@ -164,10 +168,34 @@ getTemplateOpinionListByFlowInstanceId(flowInstanceId).then((tResult) => {
     templateOpinions.value = tList
   })
 })
-const submitHandle = () => {
-  emit('submit', currentOpinion.value);
-}
 
+const activityData: FlowDTO = {
+  activityInstanceId,
+  participantId: participant,
+  flowOpinion: "",
+};
+const router = useRouter();
+const submitHandle = async (): Promise<any> => {
+  emit('submit', async () => {
+    //工作流转件
+    activityData.activityInstanceId = activityInstanceId;
+    activityData.participantId = participant;
+    activityData.flowOpinion = JSON.stringify(currentOpinion.value);
+    const result = await getNextActivity(jsonToFormData(activityData) as FormData);
+    if (result) {
+      showNotify({
+        type: 'primary',
+        message: '转件成功',
+        position: 'top',
+        onClose() {
+            router.back();
+        }
+      });
+    }
+    console.log(result);
+    return result;
+  });
+}
 </script>
 
 <style scoped lang="scss">

+ 2 - 0
client_h5/src/pages/home/index.scss

@@ -73,6 +73,7 @@
             }
             >.title {
               color: $font_color;
+              white-space: nowrap;
             }
             &::before {
               display: block;
@@ -133,6 +134,7 @@
               margin-top: 5px;
               font-size: 15px;
               color: $font_color;
+              white-space: nowrap;
             }
             >p {
               margin: 5px 0px;

+ 28 - 11
client_h5/src/pages/home/index.vue

@@ -1,8 +1,8 @@
 <script setup lang="ts">
 import { useUserStoreWithOut } from "@/stores/modules/user";
-import { getAssetsURI } from "@/utils/common";
-import { createProcessByModalId } from "@/service/flow";
-import reqest from "@/utils/request";
+import { getAssetsURI, getStoreObject } from "@/utils/common";
+import { getAttendCount, createProcessByModalId } from "@/service/flow";
+import request from "@/utils/request";
 
 const userStore = useUserStoreWithOut();
 
@@ -12,7 +12,7 @@ interface MenuItem {
   path?: string;
   icon: string;
 }
-const navMenus: MenuItem[] = [
+const navMenus = reactive<MenuItem[]>([
   {
     title: "办件中心",
     corner: 1,
@@ -39,7 +39,7 @@ const navMenus: MenuItem[] = [
     icon: "../assets/images/wdrz_icon.png",
     path: "myWeeklyLogs",
   },
-];
+]);
 interface ProcessMenuItem extends MenuItem {
   instanceId: string;
 }
@@ -71,10 +71,6 @@ const processMenus: ProcessMenuItem[] = [
 ];
 
 const personMenus: MenuItem[] = [
-  {
-    title: "我的考勤",
-    icon: "../assets/images/wdkq_icon.png",
-  },
   {
     title: "我的资产",
     path: "asset",
@@ -82,11 +78,32 @@ const personMenus: MenuItem[] = [
   },
   {
     title: "通知公告",
-    corner: 1,
+    path: 'notice',
     icon: "../assets/images/tzgg_icon.png",
   },
 ];
 const router = useRouter();
+/***
+ * 根据用户ID获取待办角标
+ */
+const initAttendCount = async () => {
+  const result = await getAttendCount({
+    userId: getStoreObject("_userInfo", "id")
+  })
+  if (result) {
+    navMenus[0]['corner'] = result?.data
+  }
+}
+initAttendCount()
+/**
+ * 获取通知公告角标
+ */
+ async function queryNoticeAndLearnCount() {
+  const urlApi = `/admin-api/adm/noticeAndLearn/readNo/count`
+   const result = await request.get(urlApi)
+   personMenus[1]['corner'] = result?.data
+}
+queryNoticeAndLearnCount()
 const toPageHandle = (path: string) => {
   router.push({
     path
@@ -120,7 +137,7 @@ const toProcessHandle = (item: ProcessMenuItem): void => {
         >
           <img :src="getAssetsURI(item['icon'])" />
           <p class="title">{{ item["title"] }}</p>
-          <span class="corner" v-if="item['corner']">{{ item["corner"] }}</span>
+          <span class="corner" v-if="item['corner'] && item['corner'] > 0">{{ item["corner"] }}</span>
         </li>
       </ul>
     </div>

+ 2 - 6
client_h5/src/pages/leave/index.vue

@@ -220,7 +220,7 @@ const onConfirm = ({ selectedOptions }) => {
   formData.value.leaveType = selectedOptions[0]?.value;
   showPicker.value = false;
 };
-const submitNextActivity = async (activeOpinion: any) => {
+const submitNextActivity = async (NextActivity: ()=>Promise<any>) => {
   form.value.validate().then(async () => {
     formData.value.leaveTimeCreateList.forEach((x: any) => {
       x.startTime = Date.parse(x.startTime);
@@ -229,11 +229,7 @@ const submitNextActivity = async (activeOpinion: any) => {
     //更新表单业务数据
     const result = await reqest.post("/business/Leave/update", formData.value);
     if (result.code === 200 || result.code === 0) {
-      //工作流转件
-      activityData.activityInstanceId = activityInstanceId;
-      activityData.participantId = participant;
-      activityData.flowOpinion = JSON.stringify(activeOpinion);
-      const result = await getNextActivity(jsonToFormData(activityData));
+      NextActivity();
       // getNextActivity(activityData).then(result => {
       //   console.log(result)
       // }).catch((err) => {

+ 23 - 5
client_h5/src/pages/notice/details/index.vue

@@ -1,12 +1,12 @@
 <template>
   <div class="notice_detail_box">
-    <h2 class="title">{{ detail['title'] }}</h2>
+    <h2 class="title">{{ detail?['title'] }}</h2>
     <div class="info">
       <div>
-        <span>发布时间:{{ detail['createTime'] }}</span>
+        <span>发布时间:{{ detail?['createTime'] }}</span>
       </div>
       <div>
-        <span>阅读次数:{{ detail['readNum'] }}</span>
+        <span>阅读次数:{{ detail?['readNum'] }}</span>
       </div>
     </div>
     <div class="file_box">
@@ -15,7 +15,7 @@
         <li v-for="(file, index) in fileUrls" @click="downloadFile(file['url'])"  :key="index">{{ file['name'] }}</li>
       </ul>
     </div>
-    <div class="content" v-html="detail['content']"></div>
+    <div class="content" v-html="detail?['content']"></div>
   </div>
 </template>
 
@@ -25,7 +25,8 @@ import { useFiles } from './mixins.ts'
 
 const { fileUrls, queryFiles, downloadFile } = useFiles(request)
 
-const detail = ref({});
+const detail = ref({
+});
 /**
  * 获取详情
  * **/
@@ -41,10 +42,27 @@ const detail = ref({});
     queryFiles(resultData.files)
   }
 }
+
+function addReadNum(idStr: any) {
+  const urlApi = `/admin-api/adm/noticeAndLearn/readNum/add`
+  const params = {
+    id: idStr
+  }
+  request.get(urlApi, { params: params })
+}
+function updateRead(idStr: any) {
+  const urlApi = `/admin-api/adm/noticeAndLearn/read/update`
+  const params = {
+    id: idStr
+  }
+  request.get(urlApi, { params: params })
+}
 const route = useRoute()
 const query = route.query
 if (query.id) {
   queryDetailById(query.id)
+  addReadNum(query.id)
+  updateRead(query.id)
 }
 </script>
 

+ 8 - 1
client_h5/src/service/flow.ts

@@ -16,6 +16,13 @@ export const getHandlerCaseCenterList = async (data: any) => {
     }
   });
 }
+/** 获取待办角标 */
+export const getAttendCount = async (params: any) => {
+  return await request.get(`/workflow/HandlerCaseApi/getAttendCount`, {
+    params
+  })
+}
+
 /** 获取办件中心汇总 */
  export const getHandlerCaseCenterCount = async (data: any) => {
   return await request.post(`/workflow/HandlerCaseCenter/count`, data, {
@@ -42,7 +49,7 @@ export const getFlowTemplateTreeDataByUser = async (data: any) => {
 }
 
 /** 获取下一步流程(转件) */
-export const getNextActivity = async (data: FlowDTO) => {
+export const getNextActivity = async (data: FormData) => {
   return await request.post(`/workflow/Transfer/getNextActivity`, data);
 }
 

+ 5 - 0
zjugis-module-adm/zjugis-module-adm-biz/src/main/java/com/zjugis/module/adm/controller/admin/noticeLearn/NoticeLearnController.java

@@ -58,4 +58,9 @@ public class NoticeLearnController {
     public CommonResult<Long> updateRead(@Valid @NotNull(message = "ID不能为空") Long id){
         return success(noticeAndLearnService.updateRead(id));
     }
+
+    @GetMapping("/readNo/count")
+    public CommonResult<Long> getCountReadNo(){
+        return success(noticeAndLearnService.getCountReadNo());
+    }
 }

+ 2 - 0
zjugis-module-adm/zjugis-module-adm-biz/src/main/java/com/zjugis/module/adm/service/noticeAndLearn/NoticeAndLearnService.java

@@ -20,4 +20,6 @@ public interface NoticeAndLearnService {
     NoticeAndLearnRespVO queryDetailById(Long id);
 
     Long updateRead(Long id) ;
+
+    Long getCountReadNo();
 }

+ 11 - 0
zjugis-module-adm/zjugis-module-adm-biz/src/main/java/com/zjugis/module/adm/service/noticeAndLearn/NoticeAndLearnServiceImpl.java

@@ -85,4 +85,15 @@ public class NoticeAndLearnServiceImpl implements NoticeAndLearnService {
         return relUserService.addData(id);
     }
 
+    @Override
+    public Long getCountReadNo() {
+        List<NoticeAndLearnRespVO> lists = noticeAndLearnMapper.selectByList(null);
+        return Integer.valueOf(lists.stream().filter((NoticeAndLearnRespVO item)->{
+            if(relUserService.queryByCount(item.getId().longValue()) == 0){
+                return true;
+            }
+            return false;
+        }).collect(Collectors.toList()).size()).longValue();
+    }
+
 }