Эх сурвалжийг харах

08 10 01 add collect data codes

hr 4 жил өмнө
parent
commit
53481d7989

+ 1 - 1
src/main/java/com/imed/costaccount/common/constants/Constant.java

@@ -23,7 +23,7 @@ public class Constant {
     /**
      * 每页显示记录数
      */
-    public static final String LIMIT = "limit";
+    public static final String LIMIT = "limit 1";
     /**
      * 排序字段
      */

+ 26 - 2
src/main/java/com/imed/costaccount/mapper/CostIncomeGroupMapper.java

@@ -2,24 +2,48 @@ package com.imed.costaccount.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.imed.costaccount.model.CostIncomeGroup;
+import com.imed.costaccount.model.vo.CollectionVO;
 import com.imed.costaccount.model.vo.CostIncomeGroupAllAmountVO;
 import com.imed.costaccount.model.vo.CostIncomeGroupBeforeVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
 /**
  * 收入归集
- * 
+ *
  * @author KCYG
  * @date 2021-08-03 16:15:20
  */
 @Mapper
 public interface CostIncomeGroupMapper extends BaseMapper<CostIncomeGroup> {
     /**
-     *  按照开单科室  执行科室 成本项目进行筛选相同的金额汇总
+     * 按照开单科室  执行科室 成本项目进行筛选相同的金额汇总
+     *
      * @param costIncomeGroupBeforeVOList
      * @return
      */
     List<CostIncomeGroupAllAmountVO> countMoney(List<CostIncomeGroupBeforeVO> costIncomeGroupBeforeVOList);
+
+    /**
+     * 获取收入归集分页列表
+     *
+     * @param startIndex 起始页
+     * @param pageSize   页码数据大小
+     * @param date       日期 yyyy-MM-dd
+     * @param hospId     医院id
+     * @return {@link CollectionVO}
+     */
+    List<CollectionVO> getCollections(@Param("startIndex") Integer startIndex, @Param("pageSize") Integer pageSize,
+                                      @Param("date") String date, @Param("hospId") Long hospId);
+
+    /**
+     * 获取收入归集分页列表
+     *
+     * @param date       日期 yyyy-MM-dd
+     * @param hospId     医院id
+     * @return 获取收入归集分页列表的总数
+     */
+    int getCollectionCount(@Param("date") String date, @Param("hospId") Long hospId);
 }

+ 16 - 0
src/main/java/com/imed/costaccount/mapper/IncomeCollectionMapper.java

@@ -0,0 +1,16 @@
+package com.imed.costaccount.mapper;
+
+import com.imed.costaccount.model.IncomeCollection;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 归集后列表
+ * 
+ * @author huangrui
+ * @date 2021-08-09 15:26:28
+ */
+@Mapper
+public interface IncomeCollectionMapper extends BaseMapper<IncomeCollection> {
+	
+}

+ 106 - 0
src/main/java/com/imed/costaccount/model/IncomeCollection.java

@@ -0,0 +1,106 @@
+package com.imed.costaccount.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.Version;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 归集后列表
+ *
+ * @author huangrui
+ * @email
+ * @date 2021-08-09 15:26:28
+ */
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("cost_income_collection")
+public class IncomeCollection implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 年份
+     */
+    private Integer year;
+    /**
+     * 月份
+     */
+    private Integer month;
+    /**
+     * 科室代码
+     */
+    private String departmentCode;
+    /**
+     * 科室名称
+     */
+    private String departmentName;
+    /**
+     * 责任中心代码
+     */
+    private String responsibilityCode;
+    /**
+     * 责任中心名称
+     */
+    private String responsibilityName;
+    /**
+     * 会计中心代码
+     */
+    private String accountingCode;
+    /**
+     * 会计中心名称
+     */
+    private String accountingName;
+    /**
+     * 成本项目代码
+     */
+    private String productCode;
+    /**
+     * 成本项目名称
+     */
+    private String productName;
+    /**
+     * 是否直接收入 0.不是,1.是
+     */
+    private Integer isDirectIncome;
+    /**
+     * 金额
+     */
+    private BigDecimal amount;
+
+    /**
+     * 归属文件
+     */
+    private Long fileId;
+
+    /**
+     * 医院id
+     */
+    private Long hospId;
+
+    /**
+     * 创建时间
+     */
+    private Long createTime;
+    /**
+     * 删除时间
+     */
+    @TableLogic(value = "0", delval = "UNIX_TIMESTAMP(NOW()) * 1000")
+    private Long deleteTime;
+
+}

+ 31 - 0
src/main/java/com/imed/costaccount/model/vo/CollectionVO.java

@@ -0,0 +1,31 @@
+package com.imed.costaccount.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 收入归集列表
+ */
+@Data
+@ApiModel("收入归集视图对象")
+public class CollectionVO {
+
+//    @ApiModelProperty(name = "fileId",value = "文件id,上传时文件id")
+//    private Long fileId;
+
+    @ApiModelProperty(name = "year",value = "年份")
+    private Integer year;
+
+    @ApiModelProperty(name = "month",value = "月份")
+    private Integer month;
+
+    @ApiModelProperty(name = "amount",value = "金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(name = "isCollection",value = "是否已归集,true.是,0.否")
+    private Boolean isCollection;
+
+}

+ 45 - 0
src/main/java/com/imed/costaccount/service/IncomeCollectionService.java

@@ -0,0 +1,45 @@
+package com.imed.costaccount.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.imed.costaccount.common.util.PageUtils;
+import com.imed.costaccount.model.IncomeCollection;
+
+/**
+ * 归集后列表
+ *
+ * @author huangrui
+ * @email 
+ * @date 2021-08-09 15:26:28
+ */
+public interface IncomeCollectionService extends IService<IncomeCollection> {
+
+    /**
+     * 获取收入归集分页列表
+     *
+     * @param current 当前页
+     * @param pageSize 页码数据大小
+     * @param date 日期 yyyy-MM-dd
+     * @param hospId 医院id
+     * @return {@link PageUtils} 分页对象
+     */
+    PageUtils getCollections(Integer current, Integer pageSize, String date, Long hospId);
+
+    /**
+     * 按年月归集数据
+     *
+     * @param year 年 数字类型
+     * @param month 月 数字
+     * @param hospId 医院id
+     */
+    void collect(Integer year, Integer month, Long hospId);
+
+    /**
+     * 按年月撤销归集
+     *
+     * @param year 年 数字类型
+     * @param month 月 数字
+     * @param hospId 医院id
+     */
+    void cancelCollect(Integer year, Integer month, Long hospId);
+}
+

+ 147 - 0
src/main/java/com/imed/costaccount/service/impl/IncomeCollectionServiceImpl.java

@@ -0,0 +1,147 @@
+package com.imed.costaccount.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.template.TemplateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.imed.costaccount.common.constants.Constant;
+import com.imed.costaccount.common.exception.CostException;
+import com.imed.costaccount.common.util.PageUtils;
+import com.imed.costaccount.mapper.CostIncomeGroupMapper;
+import com.imed.costaccount.model.CostIncomeGroup;
+import com.imed.costaccount.model.vo.CollectionVO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import com.imed.costaccount.mapper.IncomeCollectionMapper;
+import com.imed.costaccount.model.IncomeCollection;
+import com.imed.costaccount.service.IncomeCollectionService;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.imed.costaccount.common.constants.Constant.LIMIT;
+
+
+@Slf4j
+@Service("incomeCollectionService")
+public class IncomeCollectionServiceImpl
+        extends ServiceImpl<IncomeCollectionMapper, IncomeCollection>
+        implements IncomeCollectionService {
+
+    private final CostIncomeGroupMapper incomeGroupMapper;
+
+    public IncomeCollectionServiceImpl(CostIncomeGroupMapper incomeGroupMapper) {
+        this.incomeGroupMapper = incomeGroupMapper;
+    }
+
+    /**
+     * 获取收入归集分页列表
+     *
+     * @param current  当前页
+     * @param pageSize 页码数据大小
+     * @param date     日期 yyyy-MM-dd
+     * @param hospId   医院id
+     * @return {@link PageUtils} 分页对象
+     */
+    @Override
+    public PageUtils getCollections(Integer current, Integer pageSize, String date, Long hospId) {
+        current = current - 1;
+        Integer startIndex = current * pageSize;
+        List<CollectionVO> list = incomeGroupMapper.getCollections(startIndex, pageSize, date, hospId);
+        int count = incomeGroupMapper.getCollectionCount(date, hospId);
+
+        // 设置是否归集字段
+        list.forEach(i -> {
+            i.setIsCollection(true);
+            IncomeCollection one = this.getOne(
+                    new LambdaQueryWrapper<IncomeCollection>().select(IncomeCollection::getId)
+                            .eq(IncomeCollection::getYear, i.getYear())
+                            .eq(IncomeCollection::getMonth,i.getMonth())
+                            .last(LIMIT)
+            );
+            if (Objects.isNull(one)) {
+                i.setIsCollection(false);
+            }
+        });
+
+
+        return new PageUtils(list, count, pageSize, current);
+    }
+
+    /**
+     * 按年月归集数据
+     *
+     * @param year   年 数字类型
+     * @param month  月 数字
+     * @param hospId 医院id
+     */
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
+    public void collect(Integer year, Integer month, Long hospId) {
+        //  可能几十万次数据 需要分段异步多线程处理,分布式锁处理,
+        List<CostIncomeGroup> costIncomeGroups = incomeGroupMapper.selectList(
+                new LambdaQueryWrapper<CostIncomeGroup>()
+                        .eq(CostIncomeGroup::getDateYear, year)
+                        .eq(CostIncomeGroup::getDateMonth, month)
+                        .eq(CostIncomeGroup::getHospId, hospId)
+        );
+        if (costIncomeGroups.isEmpty()) {
+            String format = StrUtil.format("{}年{}月数据不存在,请先导入数据",year,month);
+            throw new CostException(format);
+        }
+        // 根据会计科目和成本项目归纳所有数据
+        Map<String, List<CostIncomeGroup>> collectMap = costIncomeGroups.stream()
+                .collect(Collectors.groupingBy(i -> i.getAccountCode() + "cost" + i.getProductCode()));
+
+        // 遍历map 组装成List保存
+        List<IncomeCollection> list = new LinkedList<>();
+        Set<Map.Entry<String, List<CostIncomeGroup>>> entries = collectMap.entrySet();
+        entries.stream().map(Map.Entry::getValue).flatMap(Collection::stream).forEach(costIncomeGroup -> {
+            IncomeCollection incomeCollection = new IncomeCollection();
+            incomeCollection.setYear(year);
+            incomeCollection.setMonth(month);
+            incomeCollection.setAccountingCode(costIncomeGroup.getAccountCode());
+            incomeCollection.setAccountingName(costIncomeGroup.getAccountName());
+            incomeCollection.setProductName(costIncomeGroup.getProductName());
+            incomeCollection.setProductCode(costIncomeGroup.getProductCode());
+            incomeCollection.setHospId(hospId);
+            // todo 来源id暂时不确定
+            incomeCollection.setFileId(costIncomeGroup.getFileId());
+            incomeCollection.setCreateTime(System.currentTimeMillis());
+            // 开单中心的数据
+            incomeCollection.setDepartmentCode(costIncomeGroup.getOpenDepartmentCode());
+            incomeCollection.setResponsibilityCode(costIncomeGroup.getOpenResponsibilityCode());
+            incomeCollection.setAmount(costIncomeGroup.getOpenDepartmentAmount());
+            list.add(incomeCollection);
+            // 执行科室数据
+            incomeCollection.setDepartmentCode(costIncomeGroup.getStartDepartmentCode());
+            incomeCollection.setResponsibilityCode(costIncomeGroup.getStartResponsibilityCode());
+            incomeCollection.setAmount(costIncomeGroup.getStartDepartmentAmount());
+            list.add(incomeCollection);
+        });
+
+        // TODO: 2021/8/10 几十万条数据如何处理
+        this.saveBatch(list);
+    }
+
+    /**
+     * 按年月撤销归集
+     *
+     * @param year   年 数字类型
+     * @param month  月 数字
+     * @param hospId 医院id
+     */
+    @Override
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
+    public void cancelCollect(Integer year, Integer month, Long hospId) {
+        LambdaQueryWrapper<IncomeCollection> wrapper = new LambdaQueryWrapper<IncomeCollection>()
+                .eq(IncomeCollection::getYear, year)
+                .eq(IncomeCollection::getMonth, month)
+                .eq(IncomeCollection::getHospId, hospId);
+        this.remove(wrapper);
+    }
+}

+ 1 - 1
src/main/java/com/imed/costaccount/service/impl/MenuServiceImpl.java

@@ -79,7 +79,7 @@ public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements Me
         List<MenuVO> menuVOS = list.stream().map(i -> {
             MenuVO menuVO = BeanUtil.convertObj(i, MenuVO.class);
             menuVO.setModifyTime(DateUtil.formatDateTime(DateUtil.date(i.getModifyTime())));
-            menuVO.setModifyUserName(userService.getUsernameByIdAndHospId(user.getId(), user.getHospId()));
+            menuVO.setModifyUserName(userService.getUsernameByIdAndHospId(i.getModifyUserId(), user.getHospId()));
             return menuVO;
         }).collect(Collectors.toList());
 

+ 55 - 0
src/main/java/com/imed/costaccount/web/IncomeCollectionController.java

@@ -0,0 +1,55 @@
+package com.imed.costaccount.web;
+
+import com.imed.costaccount.common.util.PageUtils;
+import com.imed.costaccount.common.util.Result;
+import com.imed.costaccount.service.CostIncomeGroupService;
+import com.imed.costaccount.service.IncomeCollectionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * 归集后列表
+ *
+ * @author huangrui
+ * @date 2021-08-09 15:26:28
+ */
+@Api(tags = "归集后查询相关")
+@RestController
+@RequestMapping("/costAccount/incomeCollection")
+public class IncomeCollectionController extends AbstractController {
+
+    /**
+     * 收入归集后
+     */
+    private final IncomeCollectionService incomeCollectionService;
+
+
+    public IncomeCollectionController(IncomeCollectionService incomeCollectionService) {
+        this.incomeCollectionService = incomeCollectionService;
+    }
+
+    @ApiOperation("收入归集列表")
+    @GetMapping("/getCollections")
+    public Result getCollections(@RequestParam(value = "current", defaultValue = "1") Integer current,
+                                 @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
+                                 @RequestParam(value = "date", required = false) String date) {
+        PageUtils pageUtils = incomeCollectionService.getCollections(current, pageSize, date, getHospId());
+        return Result.ok(pageUtils);
+    }
+
+    @ApiOperation("归集操作(开始归集)")
+    @PostMapping("/collect")
+    public Result collect(@RequestParam Integer year,@RequestParam Integer month) {
+        incomeCollectionService.collect(year, month, getHospId());
+        return Result.ok();
+    }
+
+    @ApiOperation("撤销归集")
+    @PostMapping("/cancelCollect")
+    public Result cancelCollect(@RequestParam Integer year,@RequestParam Integer month) {
+        incomeCollectionService.cancelCollect(year, month, getHospId());
+        return Result.ok();
+    }
+}

+ 35 - 1
src/main/resources/mapper/CostIncomeGroupMapper.xml

@@ -3,7 +3,7 @@
 
 <mapper namespace="com.imed.costaccount.mapper.CostIncomeGroupMapper">
 
-	<!-- 可根据自己的需求,是否要使用 -->
+    <!-- 可根据自己的需求,是否要使用 -->
     <resultMap type="com.imed.costaccount.model.CostIncomeGroup" id="costIncomeGroupMap">
         <result property="id" column="id"/>
         <result property="openDepartmentCode" column="open_department_code"/>
@@ -34,6 +34,40 @@
         <result property="createTime" column="create_time"/>
         <result property="deleteTime" column="delete_time"/>
     </resultMap>
+    <sql id="Base_Column_List">
+        id
+        , open_department_code, open_responsibility_code, start_department_code, start_responsibility_code, product_code, account_code, is_income,
+    open_department_amount, start_department_amount, amount, hosp_id, date_year, date_month, create_time,
+    delete_time
+    </sql>
+
+    <select id="countMoney" resultType="com.imed.costaccount.model.vo.CostIncomeGroupAllAmountVO">
+        select
+        <include refid="Base_Column_List"/>
+        ,group_concat(amount) as addMoney
+        from cost_income_group
+        group by open_department_code , start_department_code , product_code;
+    </select>
+
+    <select id="getCollections" resultType="com.imed.costaccount.model.vo.CollectionVO">
+        select  date_year as `year`, date_month as `month`, sum(amount) as amount
+        from cost_income_group
+        where hosp_id = #{hospId} and delete_time = 0
+        <if test="date != null and date != ''">
+            and date_year = YEAR(concat(#{date},'01')) and date_month = MONTH(concat(#{date},'01'))
+        </if>
+        group by date_month, date_year
+        limit #{startIndex},#{pageSize}
+    </select>
+
+    <select id="getCollectionCount" resultType="java.lang.Integer">
+        select count(*)
+        from cost_income_group
+        where hosp_id = #{hospId} and delete_time = 0
+        <if test="date != null and date != ''">
+            and date_year = YEAR(concat(#{date},'01')) and date_month = MONTH(concat(#{date},'01'))
+        </if>
+    </select>
 
 
 </mapper>

+ 28 - 0
src/main/resources/mapper/IncomeCollectionMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.imed.costaccount.mapper.IncomeCollectionMapper">
+
+	<!-- 可根据自己的需求,是否要使用 -->
+    <resultMap type="com.imed.costaccount.model.IncomeCollection" id="incomeCollectionMap">
+        <result property="id" column="id"/>
+        <result property="year" column="year"/>
+        <result property="month" column="month"/>
+        <result property="departmentCode" column="department_code"/>
+        <result property="departmentName" column="department_name"/>
+        <result property="responsibilityCode" column="responsibility_code"/>
+        <result property="responsibilityName" column="responsibility_name"/>
+        <result property="accountingCode" column="accounting_code"/>
+        <result property="accountingName" column="accounting_name"/>
+        <result property="productCode" column="product_code"/>
+        <result property="productName" column="product_name"/>
+        <result property="isDirectIncome" column="is_direct_income"/>
+        <result property="amount" column="amount"/>
+        <result property="fileId" column="file_id" />
+        <result property="hospId" column="hosp_id" />
+        <result property="createTime" column="create_time"/>
+        <result property="deleteTime" column="delete_time"/>
+    </resultMap>
+
+
+</mapper>