Răsfoiți Sursa

1.营业报表,消费次数统计规则修改为0元也计算在内
2.营业报表查询条件修改为日期格式
3.新增补贴名单导入功能

baiyun 3 luni în urmă
părinte
comite
968f58ae80

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyController.java

@@ -102,7 +102,7 @@ public class PtSubsidyController extends BaseController {
     @RepeatSubmit()
     @PutMapping("/audit")
     public R<Void> audit(@Validated(EditGroup.class) @RequestBody PtSubsidyBo bo) {
-        return toAjax(ptSubsidyService.updateByBo(bo));
+        return ptSubsidyService.auditByBo(bo);
     }
 
 

+ 17 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/controller/PtSubsidyitemController.java

@@ -12,6 +12,7 @@ import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyFirstPageVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
 import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
+import org.dromara.backstage.consumption.domain.bo.HandImportExcelConsumeBo;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.pdf.PdfUtil;
@@ -26,8 +27,10 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.system.api.model.LoginUser;
+import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -116,10 +119,9 @@ public class PtSubsidyitemController extends BaseController {
      */
     @SaCheckPermission("subsidy:ptSubsidyitem:remove")
     @Log(title = "补助明细", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{itemIds}")
-    public R<Void> remove(@NotEmpty(message = "主键不能为空")
-                          @PathVariable Long[] itemIds) {
-        return toAjax(ptSubsidyitemService.deleteWithValidByIds(List.of(itemIds), true));
+    @DeleteMapping
+    public R<Void> remove(@RequestBody List<Long> itemIds) {
+        return toAjax(ptSubsidyitemService.deleteWithValidByIds(itemIds, true));
     }
 
     // 补助报表
@@ -192,4 +194,15 @@ public class PtSubsidyitemController extends BaseController {
             throw new RuntimeException(e);
         }
     }
+
+    /**
+     * 导入补助用户名单
+     * @param file
+     * @return
+     */
+    @SaCheckPermission("subsidy:ptSubsidyitem:add")
+    @PostMapping(value="/importSubsidyDetail",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public R<List<PtSubsidyitemVo>> importExcel(@RequestPart("file") MultipartFile file) {
+        return ptSubsidyitemService.importSubsidyDetail(file);
+    }
 }

+ 8 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtSubsidyService.java

@@ -2,6 +2,7 @@ package org.dromara.backstage.cardCenter.service;
 
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyVo;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
@@ -57,6 +58,13 @@ public interface IPtSubsidyService {
      */
     Boolean updateByBo(PtSubsidyBo bo);
 
+    /**
+     * 补助任务审核
+     * @param bo 补助任务
+     * @return 审核结果
+     */
+    R<Void> auditByBo(PtSubsidyBo bo);
+
     /**
      * 校验并批量删除补助设置信息
      *

+ 9 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/IPtSubsidyitemService.java

@@ -6,8 +6,10 @@ import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyFirstPageVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
 import java.util.List;
@@ -82,4 +84,11 @@ public interface IPtSubsidyitemService {
     Boolean updateBySubsidyBo(PtSubsidyBo bo);
 
     List<PtSubsidyFirstPageVo> getPtSubsidyFirstPageVos();
+
+    /**
+     * 导入补助用户名单
+     * @param file
+     * @return
+     */
+    R<List<PtSubsidyitemVo>> importSubsidyDetail(MultipartFile file);
 }

+ 39 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtSubsidyServiceImpl.java

@@ -9,10 +9,12 @@ import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyBo;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyVo;
+import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
 import org.dromara.backstage.cardCenter.mapper.PtSubsidyMapper;
 import org.dromara.backstage.cardCenter.mapper.PtSubsidyitemMapper;
 import org.dromara.backstage.cardCenter.service.IPtSubsidyService;
 import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -202,4 +204,41 @@ public class PtSubsidyServiceImpl implements IPtSubsidyService {
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 补助任务审核
+     * @param bo 补助任务
+     * @return 审核结果
+     */
+    @Override
+    public R<Void> auditByBo(PtSubsidyBo bo) {
+        // 1. 参数校验
+        if (bo == null || bo.getMainId() == null) {
+            return R.fail("审核失败,补助任务ID不能为空");
+        }
+
+        // 2. 查询该补助任务下的所有明细记录
+        PtSubsidyitemBo itemQuery = new PtSubsidyitemBo();
+        itemQuery.setMainId(bo.getMainId());
+        List<PtSubsidyitemVo> itemList = subsidyitemService.queryList(itemQuery);
+
+        // 3. 检查是否存在匹配失败的记录
+        boolean hasFailedMatch = itemList.stream()
+            .anyMatch(item -> item.getRemark() != null && item.getRemark().contains("匹配失败"));
+
+        if (hasFailedMatch) {
+            return R.fail("审核失败,存在匹配失败的人员,请检查后重新提交");
+        }
+
+        // 4. 修改补助任务状态
+        PtSubsidy update = MapstructUtils.convert(bo, PtSubsidy.class);
+        validEntityBeforeSave(update);
+
+        boolean updateSuccess = baseMapper.updateById(update) > 0;
+        if (!updateSuccess) {
+            return R.fail("审核失败,更新补助任务状态失败");
+        }
+        return R.ok();
+    }
+
 }

+ 95 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/cardCenter/service/impl/PtSubsidyitemServiceImpl.java

@@ -8,33 +8,45 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import org.dromara.backstage.cardCenter.domain.PtSubsidyitem;
+import org.dromara.backstage.cardCenter.domain.RsSubsidyData;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyBo;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyReportBo;
 import org.dromara.backstage.cardCenter.domain.bo.PtSubsidyitemBo;
+import org.dromara.backstage.cardCenter.domain.bo.RsSubsidyDataBo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyFirstPageVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyReportVo;
 import org.dromara.backstage.cardCenter.domain.vo.PtSubsidyitemVo;
+import org.dromara.backstage.cardCenter.domain.vo.RsSubsidyDataVo;
 import org.dromara.backstage.cardCenter.mapper.PtSubsidyitemMapper;
+import org.dromara.backstage.cardCenter.mapper.RsSubsidyDataMapper;
 import org.dromara.backstage.cardCenter.service.IPtSubsidyitemService;
+import org.dromara.backstage.consumption.domain.bo.HandImportExcelConsumeBo;
 import org.dromara.backstage.payment.domain.PtUserAccount;
+import org.dromara.backstage.payment.domain.PtUserAccount4SelectVo;
 import org.dromara.backstage.payment.domain.vo.PtUserAccountVo;
 import org.dromara.backstage.payment.mapper.PtUserAccountMapper;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.service.DictService;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.api.model.LoginUser;
 import org.dromara.system.api.model.RoleDTO;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
 import static java.util.stream.Collectors.toMap;
 import static java.util.stream.Collectors.toSet;
+import static org.dromara.common.excel.utils.ExcelUtil.importExcel;
 
 /**
  * 补助明细Service业务层处理
@@ -48,6 +60,7 @@ public class PtSubsidyitemServiceImpl implements IPtSubsidyitemService {
 
     private final PtSubsidyitemMapper baseMapper;
     private final PtUserAccountMapper userAccountMapper;
+    private final RsSubsidyDataMapper rsSubsidyDataMapper;
 
     private final DictService dictService;
 
@@ -280,4 +293,86 @@ public class PtSubsidyitemServiceImpl implements IPtSubsidyitemService {
         return rs;
     }
 
+    @Override
+    public R<List<PtSubsidyitemVo>> importSubsidyDetail(MultipartFile file) {
+        try {
+            // 读取Excel文件,将数据转换为Vo对象列表
+            List<RsSubsidyDataVo> importList = ExcelUtil.importExcel(file.getInputStream(), RsSubsidyDataVo.class);
+            if (CollectionUtil.isEmpty(importList)) {
+                return R.fail("导入的Excel文件为空");
+            }
+
+            // 根据otherId查询数据库中是否存在该数据
+            List<String> otherIds = importList.stream().map(RsSubsidyDataVo::getOtherId).collect(Collectors.toList());
+            List<PtUserAccount4SelectVo> accountVos = userAccountMapper.getByOtherIdList(otherIds);
+
+            // 使用Map存储已存在的otherId,提高查询效率
+            Map<String, PtUserAccount4SelectVo> accountMap = accountVos.stream()
+                .collect(Collectors.toMap(PtUserAccount4SelectVo::getOtherId, account -> account, (existing, replacement) -> existing));
+
+            // 获取当前时间和登录用户
+            Date now = new Date();
+            LoginUser loginUser = LoginHelper.getLoginUser();
+
+            // 处理导入数据并准备保存
+            List<RsSubsidyData> saveList = new ArrayList<>();
+            List<PtSubsidyitemVo> resultList = new ArrayList<>();
+            Long userId = 0L;
+            for (RsSubsidyDataVo item : importList) {
+                RsSubsidyData data = MapstructUtils.convert(item, RsSubsidyData.class);
+                data.setCreateBy(loginUser.getNickname());
+                data.setCreateTime(now);
+
+                PtUserAccount4SelectVo accountVo = accountMap.get(item.getOtherId());
+                PtSubsidyitemVo subsidyItemVo = new PtSubsidyitemVo();
+
+                if (accountVo != null) {
+                    // 匹配成功
+                    data.setCheckResults("匹配成功");
+
+                    // 设置补助明细信息
+                    subsidyItemVo.setUserId(accountVo.getUserId());
+                    subsidyItemVo.setRealName(accountVo.getRealName());
+                    subsidyItemVo.setUserNumb(accountVo.getUserNumb());
+                    subsidyItemVo.setDeptName(accountVo.getDeptName());
+                    subsidyItemVo.setRemark("匹配成功");
+                } else {
+                    // 匹配失败
+                    data.setCheckResults("匹配失败");
+
+                    // 设置补助明细信息
+                    //给userId设默认值
+                    subsidyItemVo.setUserId(userId++);
+                    subsidyItemVo.setRealName(item.getName());
+                    subsidyItemVo.setUserNumb(item.getUserNo());
+                    subsidyItemVo.setDeptName(item.getDeptName());
+                    subsidyItemVo.setRemark("匹配失败,otherId:" + item.getOtherId());
+                }
+
+                saveList.add(data);
+                resultList.add(subsidyItemVo);
+            }
+            //将resultList中匹配失败的放在最前面
+            resultList.sort(Comparator.comparing(PtSubsidyitemVo::getRemark));
+            // 保存人事系统导入名单
+            if (!CollectionUtil.isEmpty(saveList)) {
+                rsSubsidyDataMapper.batchInsert(saveList);
+            }
+
+            // 构建返回结果
+            String msg = "导入成功";
+            long successCount = accountMap.size();
+            long totalCount = importList.size();
+
+            if (successCount < totalCount) {
+                long failCount = totalCount - successCount;
+                msg = String.format("导入成功,共导入%d条数据,其中%d条匹配成功,%d条匹配失败", totalCount, successCount, failCount);
+            }
+            R<List<PtSubsidyitemVo>> result = R.ok(resultList);
+            result.setMsg(msg);
+            return result;
+        } catch (IOException e) {
+            throw new RuntimeException("导入Excel文件失败: " + e.getMessage(), e);
+        }
+    }
 }

+ 2 - 22
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/impl/XfConsumeDetailServiceImpl.java

@@ -287,30 +287,10 @@ public class XfConsumeDetailServiceImpl implements IXfConsumeDetailService {
                                                         String roomIds, String beginDate, String endDate) {
 
         if(StringUtils.isNotBlank(beginDate)){
-            if("yyyy".equals(dateFormat)){
-                // 按年统计
-                beginDate = DateUtils.firstDayOfYear(Integer.parseInt(beginDate)).format(
-                    DateTimeFormatter.ofPattern("yyyy-MM-dd" +" 00:00:00"));
-            }else if("yyyy-MM".equals(dateFormat)){
-                String[] dateArr = beginDate.split("-");
-                beginDate = DateUtils.firstDayOfMonth(Integer.parseInt(dateArr[0]), Integer.parseInt(dateArr[1])).format(
-                    DateTimeFormatter.ofPattern("yyyy-MM-dd" +" 00:00:00"));;
-            }else {
-                beginDate += " 00:00:00";
-            }
+            beginDate += " 00:00:00";
         }
         if(StringUtils.isNotBlank(endDate)){
-            if("yyyy".equals(dateFormat)){
-                // 按年统计
-                endDate = DateUtils.lastDayOfYear(Integer.parseInt(endDate)).format(
-                    DateTimeFormatter.ofPattern("yyyy-MM-dd" +" 23:59:59"));
-            }else if("yyyy-MM".equals(dateFormat)) {
-                String[] dateArr = endDate.split("-");
-                endDate = DateUtils.lastDayOfMonth(Integer.parseInt(dateArr[0]), Integer.parseInt(dateArr[1])).format(
-                    DateTimeFormatter.ofPattern("yyyy-MM-dd" + " 23:59:59"));
-            }else {
-                endDate += " 23:59:59";
-            }
+            endDate += " 23:59:59";
         }
         return TableDataInfo.build(baseMapper.consumeAnalyze(pageQuery.build(),dateFormat, groupByTerm, accountIds,
             roomIds,

+ 6 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/payment/mapper/PtUserAccountMapper.java

@@ -54,5 +54,11 @@ public interface PtUserAccountMapper extends BaseMapperPlus<PtUserAccount, PtUse
     @Select("select * from t_pt_userAccount where user_id = #{userId}")
     PtUserAccountVo getById(@Param("userId")Long userId);
 
+    /**
+     * 根据otherId列表查询账户数据
+     * @param otherIdList
+     * @return List<PtUserAccountVo>
+     */
+    List<PtUserAccount4SelectVo> getByOtherIdList(@Param("otherIdList") List<String> otherIdList);
 
 }

+ 1 - 1
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/consumption/XfConsumeDetailMapper.xml

@@ -61,7 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             sum(case when consume_money &lt; 0 then consume_money else 0 end) as tuiKuanJinE,
             sum(case when consume_money &lt; 0 then 1 else 0 end) as tuiKuanCiShu,
             sum(consume_money) as xiaoJiJinE,
-            sum(case when  consume_money &gt; 0 then 1 else 0 end) as xiaoJiCiShu
+            sum(case when  consume_money &gt;= 0 then 1 else 0 end) as xiaoJiCiShu
         from
             t_xf_consumeDetail
         <where>

+ 12 - 0
ruoyi-modules/ruoyi-backstage/src/main/resources/mapper/payment/PtUserAccountMapper.xml

@@ -125,4 +125,16 @@
         AND c.factory_id=#{factoryId}
         ORDER BY c.create_time DESC
     </select>
+
+    <select id="getByOtherIdList" resultType="org.dromara.backstage.payment.domain.PtUserAccount4SelectVo">
+        select u.user_name,u.user_id,u.dept_id,u.real_name,u.user_numb,u.phone,u.other_id
+        ,u.photo,u.account_status,u.freeze_status,u.status,a.dept_name deptName,u.id_number as idNumber,u.sex
+        from t_pt_userAccount u
+        join t_sys_dept a on u.dept_id = a.dept_id
+        WHERE u.other_id IN
+        <foreach collection="otherIdList" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        AND u.del_flag = 0
+    </select>
 </mapper>