chengf
2025-08-18 73ad6ba1c639e8b231291a1efd7fae0d6d394143
费用报表0815
8个文件已修改
245 ■■■■ 已修改文件
java110-bean/src/main/java/com/java110/dto/fee/FeeDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-db/src/main/resources/mapper/fee/ReportFeeServiceDaoImplMapper.xml 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-db/src/main/resources/mapper/user/OwnerAppUserV1ServiceDaoImplMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-fee/src/main/java/com/java110/fee/cmd/fee/ReportFeeCmd.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-user/src/main/java/com/java110/user/cmd/login/PhoneWechatLoginCmd.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-user/src/main/java/com/java110/user/cmd/user/OwnerUserLoginCmd.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-user/src/main/java/com/java110/user/cmd/user/UserLoginCmd.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/dto/fee/FeeDto.java
@@ -185,6 +185,8 @@
    private String targetEndTime;
    private double[] report;
    public String getAmount() {
        return amount;
    }
@@ -916,4 +918,12 @@
    public void setContractFee(String contractFee) {
        this.contractFee = contractFee;
    }
    public double[] getReport() {
        return report;
    }
    public void setReport(double[] report) {
        this.report = report;
    }
}
java110-db/src/main/resources/mapper/fee/ReportFeeServiceDaoImplMapper.xml
@@ -6,9 +6,9 @@
        SELECT
        pfd.community_id,
        td.name AS '费用类型名称',
        YEAR(pfd.create_time),
        YEAR(pfd.create_time) AS '统计周期',  -- 统计周期只显示年份
        pf.fee_type_cd AS '费用类型编码',
        -- 计算各年份的收费金额(按天数比例分配)
        -- 往年年度统计
        SUM(
        CASE
        WHEN pfd.start_time < '2021-01-01' AND pfd.end_time >= '2020-01-01'
@@ -64,17 +64,153 @@
        ELSE 0
        END
        ) AS '2024年收费金额(元)',
        -- 今年按月统计(2025年)
        SUM(
        CASE
        WHEN pfd.start_time < '2026-01-01' AND pfd.end_time >= '2025-01-01'
        WHEN pfd.start_time < '2025-02-01'
        AND pfd.end_time >= '2025-01-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, '2025-12-31'),
        LEAST(pfd.end_time, LAST_DAY('2025-01-01')),
        GREATEST(pfd.start_time, '2025-01-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年收费金额(元)',
        ) AS '2025年01月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-03-01'
        AND pfd.end_time >= '2025-02-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-02-01')),
        GREATEST(pfd.start_time, '2025-02-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年02月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-04-01'
        AND pfd.end_time >= '2025-03-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-03-01')),
        GREATEST(pfd.start_time, '2025-03-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年03月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-05-01'
        AND pfd.end_time >= '2025-04-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-04-01')),
        GREATEST(pfd.start_time, '2025-04-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年04月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-06-01'
        AND pfd.end_time >= '2025-05-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-05-01')),
        GREATEST(pfd.start_time, '2025-05-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年05月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-07-01'
        AND pfd.end_time >= '2025-06-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-06-01')),
        GREATEST(pfd.start_time, '2025-06-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年06月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-08-01'
        AND pfd.end_time >= '2025-07-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-07-01')),
        GREATEST(pfd.start_time, '2025-07-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年07月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-09-01'
        AND pfd.end_time >= '2025-08-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-08-01')),
        GREATEST(pfd.start_time, '2025-08-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年08月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-10-01'
        AND pfd.end_time >= '2025-09-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-09-01')),
        GREATEST(pfd.start_time, '2025-09-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年09月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-11-01'
        AND pfd.end_time >= '2025-10-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-10-01')),
        GREATEST(pfd.start_time, '2025-10-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年10月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2025-12-01'
        AND pfd.end_time >= '2025-11-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-11-01')),
        GREATEST(pfd.start_time, '2025-11-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年11月收费金额(元)',
        SUM(
        CASE
        WHEN pfd.start_time < '2026-01-01'
        AND pfd.end_time >= '2025-12-01'
        THEN pfd.received_amount *
        DATEDIFF(
        LEAST(pfd.end_time, LAST_DAY('2025-12-01')),
        GREATEST(pfd.start_time, '2025-12-01')
        ) / DATEDIFF(pfd.end_time, pfd.start_time)
        ELSE 0
        END
        ) AS '2025年12月收费金额(元)',
        SUM(pfd.received_amount) AS '总收费金额(元)'
        FROM
        pay_fee_detail pfd
@@ -83,11 +219,15 @@
        AND td.table_columns = "fee_type_cd"
        AND td.status_cd = pf.fee_type_cd
        WHERE
        pfd.status_cd = '0' AND
        pfd.community_id = '2025081537770016'
        pfd.status_cd = '0'
        AND pfd.community_id = '2025081537770016'
        GROUP BY
        td.name, pf.fee_type_cd, pfd.community_id,YEAR(pfd.create_time)
        td.name,
        pf.fee_type_cd,
        pfd.community_id,
        YEAR(pfd.create_time)  -- 按年份分组
        ORDER BY
        td.name;
        td.name,
        YEAR(pfd.create_time);
    </select>
</mapper>
java110-db/src/main/resources/mapper/user/OwnerAppUserV1ServiceDaoImplMapper.xml
@@ -60,6 +60,12 @@
        <if test="state !=null and state != ''">
            and t.state= #{state}
        </if>
        <if test="states !=null">
            and t.state in
            <foreach collection="states" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </if>
        <if test="appUserId !=null and appUserId != ''">
            and t.app_user_id= #{appUserId}
        </if>
service-fee/src/main/java/com/java110/fee/cmd/fee/ReportFeeCmd.java
@@ -6,7 +6,10 @@
import com.java110.core.event.cmd.Cmd;
import com.java110.core.event.cmd.CmdEvent;
import com.java110.dto.community.CommunityDto;
import com.java110.dto.dict.DictDto;
import com.java110.dto.fee.FeeDto;
import com.java110.intf.community.ICommunityInnerServiceSMO;
import com.java110.intf.dev.IDictV1InnerServiceSMO;
import com.java110.intf.fee.IReportFeeInnerServiceSMO;
import com.java110.po.fee.PayFeePo;
import com.java110.utils.exception.CmdException;
@@ -20,6 +23,7 @@
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -31,6 +35,9 @@
    @Autowired
    private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;
    @Autowired
    private IDictV1InnerServiceSMO dictV1InnerServiceSMOImpl;
    @Override
    public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
@@ -48,16 +55,35 @@
        feeQueryParams.setStartYear(startYear);
        int currentYear = java.time.Year.now().getValue();
        feeQueryParams.setEndYear(currentYear + 2);
        List<Map> result = reportFeeInnerServiceSMOImpl.repostPaidInFee(feeQueryParams);
        int endYear = feeQueryParams.getEndYear();
        double[][] reports = new double[22 * (endYear - startYear)][endYear - startYear + 1];
        for(int j = 0 ; j < result.size() ; j++){
            for (int i = startYear; i <= endYear; i++) {
                reports[j][i-startYear] = (double) result.get(j).get(i+"年收费金额(元)");
        List<Map> result = reportFeeInnerServiceSMOImpl.repostPaidInFee(feeQueryParams);
        DictDto dictDto = new DictDto();
        dictDto.setTableName("pay_fee_config");
        dictDto.setTableColumns("fee_type_cd");
        List<DictDto> dictDtos = dictV1InnerServiceSMOImpl.queryDicts(dictDto);
        int doYear = endYear - startYear;
        List<FeeDto> reportFeeDtos = new ArrayList<>();
        for (int i = startYear; i <= endYear; i++) {
            for (Map map : result) {
                if (map.get("统计周期")!=null&&map.get("统计周期").equals(i)){
                    FeeDto feeDto = new FeeDto();
                    feeDto.setCurYear((i)+"");
                    feeDto.setFeeTypeCdName(map.get("费用类型名称")+"");
                    double[] doubles = new double[doYear];
                    for (int j = startYear ; j <= endYear ; j++) {
                        if(map.get((j)+"年收费金额(元)")!=null){
                            doubles[j-startYear] = ((BigDecimal)map.get((j)+"年收费金额(元)")).doubleValue();
                        }
                    }
                    feeDto.setReport(doubles);
                    reportFeeDtos.add(feeDto);
                }
            }
        }
        ResultVo resultVo = new ResultVo(reports);
        ResultVo resultVo = new ResultVo(reportFeeDtos);
        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
service-user/src/main/java/com/java110/user/cmd/login/PhoneWechatLoginCmd.java
@@ -152,16 +152,13 @@
        OwnerAppUserDto ownerAppUserDto = new OwnerAppUserDto();
        ownerAppUserDto.setUserId(userDtos.get(0).getUserId());
        ownerAppUserDto.setLink(userDtos.get(0).getTel());
        ownerAppUserDto.setState(OwnerAppUserDto.STATE_AUDIT_SUCCESS);
        List<OwnerAppUserDto> ownerAppUserDtos = ownerAppUserV1InnerServiceSMOImpl.queryOwnerAppUsers(ownerAppUserDto);
        LoginOwnerResDto loginOwnerResDto = new LoginOwnerResDto();
        if (ListUtil.isNull(ownerAppUserDtos)) {
            autoBindUserToOwner(userDtos.get(0), phoneNumber);
            loginOwnerResDto.setAuditState(userDtos.get(0).getAuditState());
            communityId = smallWeChatDtos.get(0).getObjId();
        } else {
            communityId = ownerAppUserDtos.get(0).getCommunityId();
            loginOwnerResDto.setAuditState(ownerAppUserDtos.get(0).getState());
        }
        CommunityDto communityDto = new CommunityDto();
@@ -187,6 +184,14 @@
        loginOwnerResDto.setOwnerTel(tmpUserDto.getTel());
        loginOwnerResDto.setToken(token);
        loginOwnerResDto.setKey(newKey);
        //查询认证关系
        OwnerAppUserDto dto = new OwnerAppUserDto();
        dto.setUserId(userDtos.get(0).getUserId());
        dto.setLink(userDtos.get(0).getTel());
        List<OwnerAppUserDto> dtos = ownerAppUserV1InnerServiceSMOImpl.queryOwnerAppUsers(dto);
        if(!CollectionUtils.isEmpty(dtos)){
        }
        context.setResponseEntity(ResultVo.createResponseEntity(loginOwnerResDto));
    }
@@ -232,9 +237,6 @@
            ownerAppUserPo.setUserId(userDto.getUserId());
            ownerAppUserPo.setOpenId("-1");
            ownerAppUserV1InnerServiceSMOImpl.saveOwnerAppUser(ownerAppUserPo);
            userDto.setAuditState(ownerAppUserPo.getState());
        }else{
            userDto.setAuditState(ownerAppUserDtos.get(0).getState());
        }
    }
service-user/src/main/java/com/java110/user/cmd/user/OwnerUserLoginCmd.java
@@ -146,11 +146,9 @@
        OwnerAppUserDto ownerAppUserDto = new OwnerAppUserDto();
        ownerAppUserDto.setUserId(userDtos.get(0).getUserId());
        ownerAppUserDto.setLink(userDtos.get(0).getTel());
        ownerAppUserDto.setState(OwnerAppUserDto.STATE_AUDIT_SUCCESS);
        List<OwnerAppUserDto> ownerAppUserDtos = ownerAppUserV1InnerServiceSMOImpl.queryOwnerAppUsers(ownerAppUserDto);
        LoginOwnerResDto loginOwnerResDto = new LoginOwnerResDto();
        loginOwnerResDto.setAuditState(userDtos.get(0).getAuditState());
        String communityId = "";
        LoginOwnerResDto loginOwnerResDto = new LoginOwnerResDto();
        if (!ListUtil.isNull(ownerAppUserDtos)) {
            // todo 4.0 查询小区是否存在
            communityId = ownerAppUserDtos.get(0).getCommunityId();
@@ -171,7 +169,6 @@
        //todo 生成登录token
        String token = generatorLoginToken(tmpUserDto);
        loginOwnerResDto.setCommunityId(communityDtos.get(0).getCommunityId());
        loginOwnerResDto.setCommunityName(communityDtos.get(0).getName());
@@ -310,7 +307,6 @@
            if (flag < 1) {
                throw new CmdException("添加用户业主关系失败");
            }
            userDtos.get(0).setAuditState(ownerAppUserPo.getState());
        }
        return userDtos;
    }
service-user/src/main/java/com/java110/user/cmd/user/UserLoginCmd.java
@@ -156,6 +156,14 @@
            tmpUserDto.setPassword("");
            tmpUserDto.setToken(token);
            tmpUserDto.setKey(newKey);
            //查询认证关系
            OwnerAppUserDto dto = new OwnerAppUserDto();
            dto.setUserId(userDtos.get(0).getUserId());
            dto.setLink(userDtos.get(0).getTel());
            List<OwnerAppUserDto> dtos = ownerAppUserV1InnerServiceSMOImpl.queryOwnerAppUsers(dto);
            if(!CollectionUtils.isEmpty(dtos)){
                tmpUserDto.setAuditState(dtos.get(0).getState());
            }
            context.setResponseEntity(ResultVo.createResponseEntity(tmpUserDto));
        } catch (Exception e) {
            logger.error("登录异常:", e);
@@ -244,7 +252,6 @@
            if (flag < 1) {
                throw new CmdException("添加用户业主关系失败");
            }
            userDtos.get(0).setAuditState(ownerAppUserPo.getState());
        }
        return userDtos;
    }
springboot/src/main/resources/application.yml
@@ -1,6 +1,6 @@
spring:
  profiles:
    active:  debug
    active:  dev
#  docker build -t lx .