Quellcode durchsuchen

我的部门普通报销台账

chenjun vor 1 Jahr
Ursprung
Commit
759e5da832

+ 6 - 1
client/src/api/oa/commonCost/index.ts

@@ -1,6 +1,11 @@
 import request from '@/config/axios'
 
-// 获得行政管理_考勤列表_我的
+// 获得普通报销列表
 export const getCommonCostPage = (params) => {
   return request.get({ url: '/CommonCost/page', params }, '/business')
 }
+
+// 获得部门普通报销列表
+export const getCommonCostDeptPage = (params) => {
+  return request.get({ url: '/CommonCost/page-dept', params }, '/business')
+}

+ 188 - 0
client/src/views/OaSystem/financialManagement/ptbxDeptPage/index.vue

@@ -0,0 +1,188 @@
+<template>
+  <div class="_ptbxBook">
+    <div class="searchBox">
+      <div class="form">
+        <span class="formSpan">报销单号:</span>
+        <el-input
+          v-model="queryParams.commonCostNo"
+          placeholder="请输入报销单号"
+          style="width: 210px"
+        />
+      </div>
+      <div class="form">
+        <span class="formSpan">报销人:</span>
+        <el-input v-model="queryParams.userId" placeholder="请输入报销人" style="width: 160px" />
+      </div>
+      <div class="form">
+        <span class="formSpan">申请时间:</span>
+        <el-date-picker
+          v-model="queryParams.applyTime"
+          type="daterange"
+          unlink-panels
+          range-separator="到"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        />
+      </div>
+      <div class="form">
+        <span class="formSpan">状态:</span>
+        <el-input v-model="queryParams.status" style="width: 160px" />
+      </div>
+      <div class="from">
+        <div class="btnBox">
+          <el-button type="primary" style="background: #3485ff" @click="handleQuery">
+            <img src="@/assets/imgs/OA/search.png" class="mr-8px" alt="" />
+            查询</el-button
+          >
+          <el-button type="primary">
+            <img src="@/assets/imgs/OA/open.png" class="mr-8px" alt="" />
+            导出</el-button
+          >
+        </div>
+      </div>
+    </div>
+    <div class="infoBox">
+      <ul>
+        <li v-for="(item, index) in infoList" :key="index" class="mr-40px">
+          <p>{{ item.name }}:</p>
+          <h4 class="font-size-18px">{{ item.num }}</h4>
+        </li>
+      </ul>
+    </div>
+    <div class="tableBox">
+      <div class="table" ref="tableRef">
+        <el-table
+          v-loading="loading"
+          :data="list"
+          style="width: 100%; height: 100%"
+          :style="{ height: tableHeight + 'px' }"
+          :header-cell-style="{
+            background: '#F7F8FA',
+            color: '#121518',
+            height: '50px'
+          }"
+          table-layout="fixed"
+        >
+          <el-table-column type="index" />
+          <el-table-column align="center" prop="commonCostNo" label="报销单号" />
+          <el-table-column align="center" prop="userNickname" label="报销人" />
+          <el-table-column
+            show-overflow-tooltip="true"
+            align="center"
+            prop="deptName"
+            label="报销人部门"
+          />
+          <el-table-column
+            align="center"
+            prop="applyTime"
+            :formatter="dateFormatter2"
+            label="申请时间"
+          />
+          <el-table-column align="center" prop="totalAmount" label="报销总金额" />
+          <el-table-column
+            show-overflow-tooltip="true"
+            align="center"
+            prop="projectName"
+            label="项目名称"
+          />
+          <el-table-column
+            show-overflow-tooltip="true"
+            align="center"
+            prop="projectDeptName"
+            label="项目部门"
+          />
+          <el-table-column align="center" prop="status" label="状态" />
+          <el-table-column align="center" label="操作" width="80">
+            <template #default="scope">
+              <div class="operateBtn" @click="operateClick(scope.row)">
+                <span>查看</span>
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="pageBox">
+        <el-pagination
+          v-model:current-page="queryParams.pageNo"
+          :page-size="10"
+          background
+          layout="total, prev, pager, next, jumper"
+          :total="total"
+          @current-change="handleCurrentChange"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import * as CommonCostApi from '@/api/oa/commonCost'
+import { dateFormatter2 } from '@/utils/formatTime'
+import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
+
+defineOptions({ name: 'CommonCostDept' })
+
+const { wsCache } = useCache()
+const user = wsCache.get(CACHE_KEY.USER)
+const userDeptId = user.user.deptId ? user.user.deptId : ''
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  commonCostNo: undefined,
+  userId: undefined,
+  deptId: userDeptId,
+  applyTime: [],
+  status: undefined,
+  totalAmount: undefined
+})
+const infoList: any = ref([
+  {
+    name: '报销总金额(元)',
+    num: '0'
+  },
+  {
+    name: '已报销总金额(元)',
+    num: '0'
+  },
+  {
+    name: '办理中总金额(元)',
+    num: '0'
+  }
+])
+const loading = ref(true) // 列表的加载中
+const total = ref(0) // 列表的总页数
+const list = ref([]) // 列表的数
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await CommonCostApi.getCommonCostDeptPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 分页操作 */
+const handleCurrentChange = (pageNo: number) => {
+  queryParams.pageNo = pageNo
+  getList()
+}
+
+/** 初始化 */
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style lang="scss" scoped>
+@import url(./ptbxBook.scss);
+</style>

+ 98 - 0
client/src/views/OaSystem/financialManagement/ptbxDeptPage/ptbxBook.scss

@@ -0,0 +1,98 @@
+._ptbxBook {
+  width: calc(100% - 30px);
+  height: calc(100% - 30px);
+  background: #FFFFFF;
+  border-radius: 4px 4px 4px 4px;
+  border: 1px solid #DEE0E3;
+  margin: 15px;
+
+  .searchBox {
+    width: 100%;
+    height: 125px;
+    background: #F7F8FA;
+    border-radius: 4px 4px 0 0;
+    display: flex;
+    align-items: center;
+    flex-wrap: wrap;
+    padding: 0 20px;
+    box-sizing: border-box;
+
+    .form {
+      display: flex;
+      align-items: center;
+      margin-right: 20px;
+
+      .formSpan {
+        font-size: 16px;
+      }
+
+      .btnBox {
+        display: flex;
+        align-items: center;
+      }
+    }
+  }
+
+  .infoBox {
+    width: 100%;
+    height: 55px;
+    background: #EDF2FB;
+
+    ul {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      padding: 0 20px;
+
+      li {
+        list-style: none;
+        display: flex;
+        align-items: center;
+      }
+    }
+  }
+
+  .tableBox {
+    width: 100%;
+    height: calc(100% - 180px);
+    padding: 15px 20px;
+    position: relative;
+
+    .table {
+      width: 100%;
+      height: calc(100% - 40px);
+
+      .operateBtn {
+        width: 54px;
+        height: 24px;
+        background: #EBF2FF;
+        border-radius: 16px 16px 16px 16px;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        cursor: pointer;
+
+        span {
+          color: #2E77E6;
+        }
+      }
+    }
+
+    .pageBox {
+      position: absolute;
+      right: 20px;
+      bottom: 10px;
+      text-align: right;
+    }
+  }
+  :deep(.el-radio__label),
+  :deep(.el-checkbox__label){
+      font-size: 16px;
+  }
+  :deep(.el-radio-group){
+    label {
+      margin-right: 10px;
+    }
+  }
+}

+ 8 - 2
client/src/views/OaSystem/financialManagement/ptbxPage/index.vue

@@ -116,7 +116,7 @@
           <el-table-column
             align="center"
             prop="applyTime"
-            :formatter="dateFormatter"
+            :formatter="dateFormatter2"
             label="申请时间"
           />
           <el-table-column align="center" prop="totalAmount" label="报销总金额" />
@@ -158,7 +158,7 @@
 
 <script setup lang="ts">
 import * as CommonCostApi from '@/api/oa/commonCost'
-import { dateFormatter } from '@/utils/formatTime'
+import { dateFormatter2 } from '@/utils/formatTime'
 
 defineOptions({ name: 'CommonCost' })
 const queryParams = reactive({
@@ -209,6 +209,12 @@ const handleQuery = () => {
   getList()
 }
 
+/** 分页操作 */
+const handleCurrentChange = (pageNo: number) => {
+  queryParams.pageNo = pageNo
+  getList()
+}
+
 /** 初始化 */
 onMounted(() => {
   getList()

+ 6 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/controller/CommonCostController.java

@@ -63,4 +63,10 @@ public class CommonCostController extends BaseController {
     public CommonResult<PageResult<CommonCostRespVO>> getCommonCostPage(@Valid CommonCostPageReqVO pageReqVO) {
         return CommonResult.success(commonCostService.getCommonCostPage(pageReqVO));
     }
+
+    @GetMapping("/page-dept")
+    @Operation(summary = "获得普通报销分页列表")
+    public CommonResult<PageResult<CommonCostRespVO>> getCommonCostDeptPage(@Valid CommonCostPageReqVO pageReqVO) {
+        return CommonResult.success(commonCostService.getCommonCostDeptPage(pageReqVO));
+    }
 }

+ 47 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/controller/vo/CommonCostDeptPageReqVO.java

@@ -0,0 +1,47 @@
+package com.zjugis.business.flow.commoncost.controller.vo;
+
+import com.zjugis.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+import static com.zjugis.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * @Author 陈俊
+ * @Date 2024/1/4 14:10
+ * @Version 1.0
+ */
+@Schema(description = "工作流程 - 普通报销部门分页 Request VO")
+@Data
+@ToString(callSuper = true)
+public class CommonCostDeptPageReqVO extends PageParam {
+
+    @Schema(description = "普通报销单号")
+    private String commonCostNo;
+
+    @Schema(description = "报销人")
+    private String userId;
+
+    @Schema(description = "报销人部门")
+    @NotNull(message = "报销人部门不能为空")
+    private String deptId;
+
+    @Schema(description = "申请时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] applyTime;
+
+    @Schema(description = "费用类型")
+    private String costType;
+
+    @Schema(description = "状态")
+    private String status;
+
+    @Schema(description = "报销总金额")
+    private BigDecimal totalAmount;
+}

+ 15 - 2
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/dao/CommonCostDao.java

@@ -7,7 +7,11 @@ import com.zjugis.framework.mybatis.core.mapper.BaseMapperX;
 import com.zjugis.framework.mybatis.core.query.LambdaQueryWrapperX;
 import org.apache.ibatis.annotations.Mapper;
 
-import static com.zjugis.business.constants.FlowStatusConstants.*;
+import java.util.List;
+
+import static com.zjugis.business.constants.FlowStatusConstants.FLOW_FINISHED;
+import static com.zjugis.business.constants.FlowStatusConstants.FLOW_PROCESS;
+
 /**
  * @Author 陈俊
  * @Date 2023/12/12 11:13
@@ -23,7 +27,16 @@ public interface CommonCostDao extends BaseMapperX<CommonCostDO> {
 
     default PageResult<CommonCostDO> getCommonCostPage(CommonCostPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<CommonCostDO>()
-                .in(CommonCostDO::getFlowStatus, FLOW_FINISHED,FLOW_PROCESS)
+                .in(CommonCostDO::getFlowStatus, FLOW_FINISHED, FLOW_PROCESS)
+                .orderByDesc(CommonCostDO::getApplyTime));
+    }
+
+    default PageResult<CommonCostDO> getCommonCostDeptPage(CommonCostPageReqVO reqVO, List<String> projectIds) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<CommonCostDO>()
+                .in(CommonCostDO::getFlowStatus, FLOW_FINISHED, FLOW_PROCESS)
+                .and(wq -> wq.eq(CommonCostDO::getDeptId, reqVO.getDeptId())
+                        .or()
+                        .in(CommonCostDO::getProjectId, projectIds))
                 .orderByDesc(CommonCostDO::getApplyTime));
     }
 }

+ 7 - 0
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/service/CommonCostService.java

@@ -46,4 +46,11 @@ public interface CommonCostService {
      * @return
      */
     PageResult<CommonCostRespVO> getCommonCostPage(CommonCostPageReqVO listVO);
+
+    /**
+     * 获取部门普通报销列表
+     * @param pageReqVO
+     * @return
+     */
+    PageResult<CommonCostRespVO> getCommonCostDeptPage(CommonCostPageReqVO pageReqVO);
 }

+ 36 - 15
zjugis-business/src/main/java/com/zjugis/business/flow/commoncost/service/CommonCostServiceImpl.java

@@ -39,6 +39,7 @@ import java.util.*;
 import static com.zjugis.business.constants.FlowStatusConstants.*;
 import static com.zjugis.business.enums.ErrorCodeConstants.COMMON_COST_NOT_EXISTS;
 import static com.zjugis.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.zjugis.framework.common.util.collection.CollectionUtils.convertList;
 import static com.zjugis.framework.common.util.collection.CollectionUtils.convertSet;
 
 /**
@@ -180,22 +181,42 @@ public class CommonCostServiceImpl implements CommonCostService {
     @Override
     public PageResult<CommonCostRespVO> getCommonCostPage(CommonCostPageReqVO listVO) {
         PageResult<CommonCostDO> pageResult = commonCostDao.getCommonCostPage(listVO);
+        PageResult<CommonCostRespVO> commonCostRespVOPageResult = getCommonCostRespVOPageResult(pageResult);
+        return commonCostRespVOPageResult;
+    }
+
+    @Override
+    public PageResult<CommonCostRespVO> getCommonCostDeptPage(CommonCostPageReqVO pageReqVO) {
+        List<Project> projects = projectService.selectByDeptId(pageReqVO.getDeptId());
+        List<String> deptProjectIds = convertList(projects, Project::getId);
+        PageResult<CommonCostDO> pageResult = commonCostDao.getCommonCostDeptPage(pageReqVO,deptProjectIds);
+        PageResult<CommonCostRespVO> commonCostRespVOPageResult = getCommonCostRespVOPageResult(pageResult);
+        return commonCostRespVOPageResult;
+    }
+
+    private PageResult<CommonCostRespVO> getCommonCostRespVOPageResult(PageResult<CommonCostDO> pageResult) {
         PageResult<CommonCostRespVO> commonCostRespVOPageResult = CommonCostConvert.INSTANCE.convertPage(pageResult);
-        List<CommonCostRespVO> resultList = commonCostRespVOPageResult.getList();
-        Set<String> projectIds = convertSet(resultList, CommonCostRespVO::getProjectId);
-        List<Project> projectList = projectService.selectByIds(projectIds);
-        resultList.forEach(commonCostRespVO -> {
-            Project projectDO = projectList.stream().filter(project -> project.getId().equals(commonCostRespVO.getProjectId())).findFirst().get();
-            commonCostRespVO.setProjectName(projectDO.getXmmc());
-            commonCostRespVO.setProjectDeptName(projectDO.getZrbm());
-            Integer flowStatus = commonCostRespVO.getFlowStatus();
-            if(FLOW_FINISHED==flowStatus){
-                commonCostRespVO.setStatus("已报");
-            }
-            if(FLOW_PROCESS==flowStatus){
-                commonCostRespVO.setStatus("办理中");
-            }
-        });
+        if(pageResult.getTotal()>0){
+            List<CommonCostRespVO> resultList = commonCostRespVOPageResult.getList();
+            Set<String> projectIds = convertSet(resultList, CommonCostRespVO::getProjectId);
+            List<Project> projectList = projectService.selectByIds(projectIds);
+            resultList.forEach(commonCostRespVO -> {
+                Integer isAgent = commonCostRespVO.getIsAgent();
+                //不是代办项目
+                if(0==isAgent){
+                    Project projectDO = projectList.stream().filter(project -> project.getId().equals(commonCostRespVO.getProjectId())).findFirst().get();
+                    commonCostRespVO.setProjectName(projectDO.getXmmc());
+                    commonCostRespVO.setProjectDeptName(projectDO.getZrbm());
+                }
+                Integer flowStatus = commonCostRespVO.getFlowStatus();
+                if (FLOW_FINISHED == flowStatus) {
+                    commonCostRespVO.setStatus("已报");
+                }
+                if (FLOW_PROCESS == flowStatus) {
+                    commonCostRespVO.setStatus("办理中");
+                }
+            });
+        }
         return commonCostRespVOPageResult;
     }
 }

+ 6 - 0
zjugis-business/src/main/java/com/zjugis/business/mapper/ProjectMapper.java

@@ -6,6 +6,7 @@ import com.zjugis.business.bean.entity.Project;
 import com.zjugis.business.bean.response.ProjectCalculateResponse;
 import com.zjugis.business.bean.response.ProjectResponse;
 import com.zjugis.framework.mybatis.core.mapper.BaseMapperX;
+import com.zjugis.framework.mybatis.core.query.LambdaQueryWrapperX;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
@@ -25,5 +26,10 @@ public interface ProjectMapper extends BaseMapperX<Project> {
     List<ProjectResponse> selectWithChildren(@Param("id") String id);
 
     Page<Project> page(Page<Project> page, @Param("params") ProjectDto projectDto);
+
+    default List<Project> selectByDeptId(String deptId) {
+        return selectList(new LambdaQueryWrapperX<Project>()
+                .eq(Project::getZrbmId, deptId));
+    }
 }
 

+ 7 - 0
zjugis-business/src/main/java/com/zjugis/business/service/ProjectService.java

@@ -27,6 +27,13 @@ public interface ProjectService {
 
     List<Project> selectByIds(Set<String> ids);
 
+    /**
+     * 通过责任部门ID获取项目列表
+     * @param deptId
+     * @return
+     */
+    List<Project> selectByDeptId(String deptId);
+
     Project selectByInstanceId(String id);
 
     ProjectResponse selectWithChildren(String id);

+ 5 - 0
zjugis-business/src/main/java/com/zjugis/business/service/impl/ProjectServiceImpl.java

@@ -50,6 +50,11 @@ public class ProjectServiceImpl implements ProjectService {
         return projectMapper.selectBatchIds(ids);
     }
 
+    @Override
+    public List<Project> selectByDeptId(String deptId) {
+        return projectMapper.selectByDeptId(deptId);
+    }
+
     /**
      * @param id
      * @return