Ver código fonte

差旅报销台账相关修改

chenjun 1 ano atrás
pai
commit
71fc17ad86

+ 5 - 0
client/src/api/system/user/index.ts

@@ -81,6 +81,11 @@ export const getSimpleUserAllList = (): Promise<UserVO[]> => {
   return request.get({ url: '/system/user/list-all-simple-all' })
 }
 
+// 获取部门用户(包括未开启、已开启)精简信息列表
+export const getSimpleDeptUserAllList = (deptId: number): Promise<UserVO[]> => {
+  return request.get({ url: '/system/user/list-dept-simple-all?deptId=' + deptId })
+}
+
 // 获取用户精简信息Map
 export const getSimpleUserMap = (): Promise<any> => {
   const userMap = {}

+ 32 - 28
client/src/views/OaSystem/financialManagement/clfbxDeptPage/index.vue

@@ -1,22 +1,6 @@
 <template>
   <div class="oa-sys-list-view">
     <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.commonCostNo"
-          placeholder="请输入报销单号"
-          style="width: 210px"
-        />
-      </div>
       <div class="form">
         <span class="formSpan">报销单号:</span>
         <el-input
@@ -27,12 +11,20 @@
       </div>
       <div class="form">
         <span class="formSpan">报销人:</span>
-        <el-input v-model="queryParams.userId" placeholder="请输入报销人" style="width: 160px" />
+        <el-select v-model="queryParams.userId" filterable clearable placeholder="请选择报销人">
+          <el-option
+            v-for="item in userList"
+            :key="item.id"
+            :label="item.nickname"
+            :value="item.id"
+          />
+        </el-select>
       </div>
       <div class="form" style="width: 380px">
         <span class="formSpan">申请时间:</span>
         <el-date-picker
           v-model="queryParams.applyTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
           unlink-panels
           range-separator="到"
@@ -42,7 +34,14 @@
       </div>
       <div class="form">
         <span class="formSpan">状态:</span>
-        <el-input v-model="queryParams.status" style="width: 160px" />
+        <el-select v-model="queryParams.status" placeholder="状态" clearable class="!w-240px">
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.FINANCE_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
       </div>
       <div class="form">
         <span class="formSpan">报销总金额:</span>
@@ -58,10 +57,6 @@
             <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>
@@ -69,7 +64,7 @@
       <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>
+          <h4 class="font-size-18px">{{ item.num.toFixed(2) }}</h4>
         </li>
       </ul>
     </div>
@@ -121,7 +116,6 @@
             <span>{{ dateFormatter2(null, null, scope.row.endTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="partnerNames" label="同行人" />
         <el-table-column align="center" prop="status" label="状态" />
         <el-table-column align="center" label="操作" fixed="right" width="80">
           <template #default="scope">
@@ -147,7 +141,9 @@
 </template>
 
 <script setup lang="ts">
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import * as TravelCostApi from '@/api/oa/travelCost'
+import * as UserApi from '@/api/system/user'
 import { dateFormatter2 } from '@/utils/formatTime'
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 import TableLayout from '../../oaViews/layout/TableLayout.vue'
@@ -160,7 +156,7 @@ const userDeptId = user.user.deptId ? user.user.deptId : ''
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
-  commonCostNo: undefined,
+  travelCostNo: undefined,
   userId: undefined,
   deptId: userDeptId,
   applyTime: [],
@@ -172,20 +168,21 @@ const queryParams = reactive({
 const infoList: any = ref([
   {
     name: '报销总金额(元)',
-    num: '0'
+    num: 0
   },
   {
     name: '已报销总金额(元)',
-    num: '0'
+    num: 0
   },
   {
     name: '办理中总金额(元)',
-    num: '0'
+    num: 0
   }
 ])
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
 const list = ref([]) // 列表的数
+const userList = ref<UserApi.UserVO[]>([]) // 用户列表
 
 /** 查询列表 */
 const getList = async () => {
@@ -220,8 +217,15 @@ const handleCurrentChange = (pageNo: number) => {
   getList()
 }
 
+/** 用户列表 */
+const initDeptUsers = async () => {
+  // 获得用户列表
+  userList.value = await UserApi.getSimpleDeptUserAllList(userDeptId)
+}
+
 /** 初始化 */
 onMounted(() => {
+  initDeptUsers()
   getList()
   getOverview()
 })

+ 67 - 26
client/src/views/OaSystem/financialManagement/clfbxPage/index.vue

@@ -3,27 +3,40 @@
     <div class="searchBox">
       <div class="form">
         <span class="formSpan">报销单号:</span>
-        <el-input v-model="queryParams.commonCostNo" placeholder="请输入报销单号" />
+        <el-input v-model="queryParams.travelCostNo" placeholder="请输入报销单号" />
       </div>
       <div class="form">
         <span class="formSpan">报销人:</span>
-        <el-input v-model="queryParams.userId" placeholder="请输入报销人" />
+        <el-tree-select
+          v-model="queryParams.userId"
+          :data="userList"
+          :props="defaultProps"
+          check-strictly
+          clearable
+          filterable
+          default-expand-all
+          node-key="id"
+          placeholder="请选择人员"
+        />
       </div>
       <div class="form">
         <span class="formSpan">报销人部门:</span>
-        <el-select width="160px" v-model="queryParams.deptId" placeholder="请选择部门">
-          <el-option
-            v-for="item in industryListAll"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          />
-        </el-select>
+        <el-tree-select
+          v-model="queryParams.deptId"
+          :data="deptList"
+          :props="defaultProps"
+          check-strictly
+          clearable
+          default-expand-all
+          node-key="id"
+          placeholder="请选择部门"
+        />
       </div>
       <div class="form" style="width: 380px">
         <span class="formSpan">申请时间:</span>
         <el-date-picker
           v-model="queryParams.applyTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
           type="daterange"
           unlink-panels
           range-separator="到"
@@ -33,15 +46,27 @@
       </div>
       <div class="form">
         <span class="formSpan">项目部门:</span>
-        <el-input v-model="queryParams.projectDeptId" placeholder="请输入项目部门" />
-      </div>
-      <div class="form">
-        <span class="formSpan">报销类型:</span>
-        <el-input v-model="queryParams.costType" placeholder="请输入报销类型" />
+        <el-tree-select
+          v-model="queryParams.projectDeptId"
+          :data="deptList"
+          :props="defaultProps"
+          check-strictly
+          clearable
+          default-expand-all
+          node-key="id"
+          placeholder="请选择项目部门"
+        />
       </div>
       <div class="form">
         <span class="formSpan">状态:</span>
-        <el-input v-model="queryParams.status" />
+        <el-select v-model="queryParams.status" placeholder="状态" clearable class="!w-240px">
+          <el-option
+            v-for="dict in getIntDictOptions(DICT_TYPE.FINANCE_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
       </div>
       <div class="form">
         <span class="formSpan">报销总金额:</span>
@@ -53,10 +78,6 @@
             <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>
@@ -64,7 +85,7 @@
       <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>
+          <h4 class="font-size-18px">{{ item.num.toFixed(2) }}</h4>
         </li>
       </ul>
     </div>
@@ -116,7 +137,6 @@
             <span>{{ dateFormatter2(null, null, scope.row.endTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="partnerNames" label="同行人" />
         <el-table-column align="center" prop="status" label="状态" />
         <el-table-column align="center" label="操作" fixed="right" width="80">
           <template #default="scope">
@@ -141,15 +161,18 @@
 </template>
 
 <script setup lang="ts">
+import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import * as TravelCostApi from '@/api/oa/travelCost'
+import * as DeptApi from '@/api/system/dept'
 import { dateFormatter2 } from '@/utils/formatTime'
+import { defaultProps, handleTree } from '@/utils/tree'
 import TableLayout from '../../oaViews/layout/TableLayout.vue'
 
 defineOptions({ name: 'TravelCost' })
 const queryParams = reactive({
   pageNo: 1,
   pageSize: 10,
-  commonCostNo: undefined,
+  travelCostNo: undefined,
   userId: undefined,
   deptId: undefined,
   applyTime: [],
@@ -161,20 +184,22 @@ const queryParams = reactive({
 const infoList: any = ref([
   {
     name: '报销总金额(元)',
-    num: '0'
+    num: 0
   },
   {
     name: '已报销总金额(元)',
-    num: '0'
+    num: 0
   },
   {
     name: '办理中总金额(元)',
-    num: '0'
+    num: 0
   }
 ])
 const loading = ref(true) // 列表的加载中
 const total = ref(0) // 列表的总页数
 const list = ref([]) // 列表的数
+const deptList = ref<Tree[]>([]) // 树形结构
+const userList = ref<Tree[]>([]) // 树形结构
 
 /** 查询列表 */
 const getList = async () => {
@@ -188,6 +213,20 @@ const getList = async () => {
   }
 }
 
+/** 用户列表 */
+const initTreeUsers = async () => {
+  DeptApi.getSimpleDeptUserAllList().then((res) => {
+    userList.value = handleTree(res)
+  })
+}
+
+/** 部门列表 */
+const initTreeDeps = async () => {
+  DeptApi.getSimpleDeptList().then((res) => {
+    deptList.value = handleTree(res)
+  })
+}
+
 /** 查询概况 */
 const getOverview = async () => {
   const data = await TravelCostApi.getTravelCostOverview(queryParams)
@@ -211,6 +250,8 @@ const handleCurrentChange = (pageNo: number) => {
 
 /** 初始化 */
 onMounted(() => {
+  initTreeDeps()
+  initTreeUsers()
   getList()
   getOverview()
 })

+ 4 - 4
client/src/views/OaSystem/financialManagement/financeCost/index.vue

@@ -85,7 +85,7 @@
       <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>
+          <h4 class="font-size-18px">{{ item.num.toFixed(2) }}</h4>
         </li>
       </ul>
     </div>
@@ -168,15 +168,15 @@ const router = useRouter()
 const infoList: any = ref([
   {
     name: '报销总金额(元)',
-    num: '0'
+    num: 0
   },
   {
     name: '已报销总金额(元)',
-    num: '0'
+    num: 0
   },
   {
     name: '办理中总金额(元)',
-    num: '0'
+    num: 0
   }
 ])
 const typeOptions = [

+ 24 - 2
zjugis-business/src/main/java/com/zjugis/business/flow/travelcost/dao/TravelCostDao.java

@@ -23,22 +23,39 @@ import static com.zjugis.business.constants.FlowStatusConstants.FLOW_PAYMENT;
  */
 @Mapper
 public interface TravelCostDao extends BaseMapperX<TravelCostDO> {
-    default PageResult<TravelCostDO> getTravelCostPage(TravelCostPageReqVO pageReqVO) {
+    default PageResult<TravelCostDO> getTravelCostPage(TravelCostPageReqVO pageReqVO, List<String> deptProjectIds, Set<String> deptIds) {
         return selectPage(pageReqVO, new LambdaQueryWrapperX<TravelCostDO>()
                 .eqIfPresent(TravelCostDO::getUserId, pageReqVO.getUserId())
+                .inIfPresent(TravelCostDO::getDeptId, deptIds)
+                .likeIfPresent(TravelCostDO::getTravelCostNo, pageReqVO.getTravelCostNo())
+                .betweenIfPresent(TravelCostDO::getApplyTime, pageReqVO.getApplyTime())
+                .eqIfPresent(TravelCostDO::getTotalAmount, pageReqVO.getTotalAmount())
+                .inIfPresent(TravelCostDO::getProjectId, deptProjectIds)
+                .eqIfPresent(TravelCostDO::getFlowStatus, pageReqVO.getStatus())
                 .in(TravelCostDO::getFlowStatus, FLOW_FINISHED, FLOW_PAYMENT)
                 .orderByDesc(TravelCostDO::getApplyTime));
     }
 
-    default List<TravelCostDO> getTravelCostList(TravelCostPageReqVO pageReqVO) {
+    default List<TravelCostDO> getTravelCostList(TravelCostPageReqVO pageReqVO, List<String> deptProjectIds, Set<String> deptIds) {
         return selectList(new LambdaQueryWrapperX<TravelCostDO>()
                 .eqIfPresent(TravelCostDO::getUserId, pageReqVO.getUserId())
+                .inIfPresent(TravelCostDO::getDeptId, deptIds)
+                .likeIfPresent(TravelCostDO::getTravelCostNo, pageReqVO.getTravelCostNo())
+                .betweenIfPresent(TravelCostDO::getApplyTime, pageReqVO.getApplyTime())
+                .eqIfPresent(TravelCostDO::getTotalAmount, pageReqVO.getTotalAmount())
+                .inIfPresent(TravelCostDO::getProjectId, deptProjectIds)
+                .eqIfPresent(TravelCostDO::getFlowStatus, pageReqVO.getStatus())
                 .in(TravelCostDO::getFlowStatus, FLOW_FINISHED, FLOW_PAYMENT)
                 .orderByDesc(TravelCostDO::getApplyTime));
     }
 
     default PageResult<TravelCostDO> getTravelCostDeptPage(TravelCostPageReqVO pageReqVO, List<String> projectIds) {
         return selectPage(pageReqVO, new LambdaQueryWrapperX<TravelCostDO>()
+                .eqIfPresent(TravelCostDO::getUserId, pageReqVO.getUserId())
+                .likeIfPresent(TravelCostDO::getTravelCostNo, pageReqVO.getTravelCostNo())
+                .betweenIfPresent(TravelCostDO::getApplyTime, pageReqVO.getApplyTime())
+                .eqIfPresent(TravelCostDO::getTotalAmount, pageReqVO.getTotalAmount())
+                .eqIfPresent(TravelCostDO::getFlowStatus, pageReqVO.getStatus())
                 .in(TravelCostDO::getFlowStatus, FLOW_FINISHED, FLOW_PAYMENT)
                 .and(wq -> wq.eq(TravelCostDO::getDeptId, pageReqVO.getDeptId())
                         .or()
@@ -48,6 +65,11 @@ public interface TravelCostDao extends BaseMapperX<TravelCostDO> {
 
     default List<TravelCostDO> getTravelCostDeptList(TravelCostPageReqVO pageReqVO, List<String> projectIds) {
         return selectList(new LambdaQueryWrapperX<TravelCostDO>()
+                .eqIfPresent(TravelCostDO::getUserId, pageReqVO.getUserId())
+                .likeIfPresent(TravelCostDO::getTravelCostNo, pageReqVO.getTravelCostNo())
+                .betweenIfPresent(TravelCostDO::getApplyTime, pageReqVO.getApplyTime())
+                .eqIfPresent(TravelCostDO::getTotalAmount, pageReqVO.getTotalAmount())
+                .eqIfPresent(TravelCostDO::getFlowStatus, pageReqVO.getStatus())
                 .in(TravelCostDO::getFlowStatus, FLOW_FINISHED, FLOW_PAYMENT)
                 .and(wq -> wq.eq(TravelCostDO::getDeptId, pageReqVO.getDeptId())
                         .or()

+ 12 - 2
zjugis-business/src/main/java/com/zjugis/business/flow/travelcost/service/TravelCostServiceImpl.java

@@ -80,7 +80,12 @@ public class TravelCostServiceImpl implements TravelCostService {
 
     @Override
     public PageResult<TravelCostRespVO> getTravelCostPage(TravelCostPageReqVO pageReqVO) {
-        PageResult<TravelCostDO> pageResult = travelCostDao.getTravelCostPage(pageReqVO);
+        List<String> deptProjectIds = Collections.emptyList();
+        if (StringUtils.isNotEmpty(pageReqVO.getProjectDeptId())){
+            List<Project> deptProjects = projectService.selectByDeptId(pageReqVO.getProjectDeptId());
+            deptProjectIds = convertList(deptProjects, Project::getId);
+        }
+        PageResult<TravelCostDO> pageResult = travelCostDao.getTravelCostPage(pageReqVO, deptProjectIds, commonService.getDeptCondition(pageReqVO.getDeptId()));
         PageResult<TravelCostRespVO> travelCostRespVOPageResult = getTravelCostRespVOPageResult(pageResult);
         return travelCostRespVOPageResult;
     }
@@ -96,7 +101,12 @@ public class TravelCostServiceImpl implements TravelCostService {
 
     @Override
     public TravelCostOverviewVO getTravelCostOverview(TravelCostPageReqVO pageReqVO) {
-        List<TravelCostDO> travelCostList = travelCostDao.getTravelCostList(pageReqVO);
+        List<String> deptProjectIds = Collections.emptyList();
+        if (StringUtils.isNotEmpty(pageReqVO.getProjectDeptId())){
+            List<Project> deptProjects = projectService.selectByDeptId(pageReqVO.getProjectDeptId());
+            deptProjectIds = convertList(deptProjects, Project::getId);
+        }
+        List<TravelCostDO> travelCostList = travelCostDao.getTravelCostList(pageReqVO, deptProjectIds, commonService.getDeptCondition(pageReqVO.getDeptId()));
         TravelCostOverviewVO result = new TravelCostOverviewVO();
         double totalAmount = travelCostList.stream().collect(Collectors.summarizingDouble(value -> value.getTotalAmount().doubleValue())).getSum();
         double totalUseAmount = travelCostList.stream().filter(useMoneyDO -> useMoneyDO.getFlowStatus() == FLOW_FINISHED).collect(Collectors.summarizingDouble(value -> value.getTotalAmount().doubleValue())).getSum();