Browse Source

Merge remote-tracking branch 'origin/master'

yewc 1 year ago
parent
commit
6ffc3d247d

+ 2 - 1
client/src/utils/constants.ts

@@ -35,7 +35,8 @@ export const SystemDataScopeEnum = {
   DEPT_CUSTOM: 2, // 指定部门数据权限
   DEPT_ONLY: 3, // 部门数据权限
   DEPT_AND_CHILD: 4, // 部门及以下数据权限
-  DEPT_SELF: 5 // 仅本人数据权限
+  DEPT_SELF: 5, // 仅本人数据权限
+  NONE: 0 // 不做控制
 }
 
 /**

+ 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",

+ 35 - 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,35 @@ 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("转件-----------------------")
+    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: "assetMy",
@@ -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 - 20
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) => {
@@ -242,20 +238,6 @@ const submitNextActivity = async (activeOpinion: any) => {
     }
   });
 };
-const jsonToFormData = (json: any): FormData | null => {
-  const keys: string[] = Object.keys(json);
-  if (keys.length > 0) {
-    const formData = new FormData();
-    keys.forEach((key) => {
-      formData.append(
-        key,
-        json[key] instanceof Object ? JSON.stringify(json[key]) : json[key]
-      );
-    });
-    return formData;
-  }
-  return null;
-};
 
 /** 初始化表单数据 */
 const initFormData = async () => {

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

@@ -25,7 +25,12 @@ import { useFiles } from './mixins.ts'
 
 const { fileUrls, queryFiles, downloadFile } = useFiles(request)
 
-const detail = ref({});
+const detail = ref({
+  title: '',
+  createTime: '',
+  readNum: 0,
+  content: ''
+});
 /**
  * 获取详情
  * **/
@@ -41,10 +46,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 - 1
zjugis-module-adm/zjugis-module-adm-biz/src/main/java/com/zjugis/module/adm/framework/rpc/config/RpcConfiguration.java

@@ -1,6 +1,7 @@
 package com.zjugis.module.adm.framework.rpc.config;
 
 import com.zjugis.module.infra.api.config.ConfigApi;
+import com.zjugis.module.infra.api.ding.DingApi;
 import com.zjugis.module.system.api.dept.DeptApi;
 import com.zjugis.module.system.api.user.AdminUserApi;
 import org.springframework.cloud.openfeign.EnableFeignClients;
@@ -12,6 +13,6 @@ import org.springframework.context.annotation.Configuration;
  * @Version 1.0
  */
 @Configuration(proxyBeanMethods = false)
-@EnableFeignClients(clients = {AdminUserApi.class, DeptApi.class, ConfigApi.class})
+@EnableFeignClients(clients = {AdminUserApi.class, DeptApi.class, ConfigApi.class, DingApi.class})
 public class RpcConfiguration {
 }

+ 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();
+    }
+
 }

+ 2 - 1
zjugis-module-system/zjugis-module-system-api/src/main/java/com/zjugis/module/system/enums/permission/DataScopeEnum.java

@@ -20,7 +20,8 @@ public enum DataScopeEnum {
     DEPT_ONLY(3), // 部门数据权限
     DEPT_AND_CHILD(4), // 部门及以下数据权限
 
-    SELF(5); // 仅本人数据权限
+    SELF(5), // 仅本人数据权限
+    NONE(0); // 不做控制
 
     /**
      * 范围

+ 7 - 2
zjugis-module-system/zjugis-module-system-biz/src/main/java/com/zjugis/module/system/dal/mysql/dict/DictDataMapper.java

@@ -1,5 +1,6 @@
 package com.zjugis.module.system.dal.mysql.dict;
 
+import com.zjugis.framework.common.enums.CommonStatusEnum;
 import com.zjugis.framework.common.pojo.PageResult;
 import com.zjugis.framework.mybatis.core.mapper.BaseMapperX;
 import com.zjugis.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -49,11 +50,15 @@ public interface DictDataMapper extends BaseMapperX<DictDataDO> {
     }
 
     default List<DictDataDO> getDictDataListByType(String dictType) {
-        return selectList(DictDataDO::getDictType, dictType);
+        return selectList(new LambdaQueryWrapperX<DictDataDO>().eqIfPresent(DictDataDO::getDictType, dictType).eqIfPresent(DictDataDO::getStatus, CommonStatusEnum.ENABLE.getStatus()));
     }
 
 
     default List<DictDataDO> getDictDataListByTypes(Collection<String> types) {
-        return selectList(new LambdaQueryWrapperX<DictDataDO>().inIfPresent(DictDataDO::getDictType, types));
+        return selectList(new LambdaQueryWrapperX<DictDataDO>().inIfPresent(DictDataDO::getDictType, types).eqIfPresent(DictDataDO::getStatus, CommonStatusEnum.ENABLE.getStatus()));
+    }
+
+    default List<DictDataDO> selectEnableList(){
+        return selectList(new LambdaQueryWrapperX<DictDataDO>().eqIfPresent(DictDataDO::getStatus, CommonStatusEnum.ENABLE.getStatus()));
     }
 }

+ 1 - 1
zjugis-module-system/zjugis-module-system-biz/src/main/java/com/zjugis/module/system/service/dict/DictDataServiceImpl.java

@@ -49,7 +49,7 @@ public class DictDataServiceImpl implements DictDataService {
 
     @Override
     public List<DictDataDO> getDictDataList() {
-        List<DictDataDO> list = dictDataMapper.selectList();
+        List<DictDataDO> list = dictDataMapper.selectEnableList();
         list.sort(COMPARATOR_TYPE_AND_SORT);
         return list;
     }

+ 1 - 1
zjugis-module-system/zjugis-module-system-biz/src/main/java/com/zjugis/module/system/service/permission/PermissionServiceImpl.java

@@ -285,7 +285,7 @@ public class PermissionServiceImpl implements PermissionService {
         // 遍历每个角色,计算
         for (RoleDO role : roles) {
             // 为空时,跳过
-            if (role.getDataScope() == null) {
+            if (role.getDataScope() == null || Objects.equals(role.getDataScope(), DataScopeEnum.NONE.getScope())) {
                 continue;
             }
             // 情况一,ALL