Browse Source

抄表数据接收接口开发

huangpeng 2 months ago
parent
commit
8eedb9b47a

+ 9 - 0
zhsw-common/src/main/java/com/rongwei/zhsw/system/dao/SwMonthlyMeterReadingRecordDao.java

@@ -0,0 +1,9 @@
+package com.rongwei.zhsw.system.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.rongwe.zhsw.system.domain.SwMonthlyMeterReadingRecordDo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SwMonthlyMeterReadingRecordDao extends BaseMapper<SwMonthlyMeterReadingRecordDo> {
+}

+ 69 - 0
zhsw-common/src/main/java/com/rongwei/zhsw/system/filter/WhitelistAuthFilter.java

@@ -0,0 +1,69 @@
+package com.rongwei.zhsw.system.filter;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import java.io.IOException;
+import javax.servlet.*;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Component // 确保被Spring扫描到
+public class WhitelistAuthFilter  implements Filter {
+
+    private static final Logger log = LoggerFactory.getLogger(WhitelistAuthFilter.class);
+
+    //白名單IP
+    @Value("${customWhiteIps:#{null}}")
+    private String customWhiteIps;
+
+    //需要拦截的地址
+    @Value("${interceptUrls:#{null}}")
+    private String interceptUrls;
+
+
+
+    @Override
+    public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+
+        System.out.println("WhitelistAuthFilter开始处理请求");
+
+        // 获取请求 URL
+        HttpServletRequest request = (HttpServletRequest) req;
+        HttpServletResponse httpResponse = (HttpServletResponse) response;
+
+        // 获取请求 URL
+        String url = request.getRequestURI();
+
+        // 获取客户端 IP
+        String clientIp = getClientIp(request);
+
+        //拦截 固定地址
+        if (StringUtils.isNotBlank(interceptUrls) && interceptUrls.contains(url)
+          && (StringUtils.isBlank(customWhiteIps) ||  !customWhiteIps.contains(clientIp))
+        ){
+            httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
+            return;
+        }
+
+        // 非保护路径或IP验证通过,继续执行
+        chain.doFilter(request, response);
+    }
+
+
+    public  String getClientIp(HttpServletRequest request) {
+
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+    }
+}

+ 13 - 0
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/SwMonthlyMeterReadingRecordService.java

@@ -0,0 +1,13 @@
+package com.rongwei.zhsw.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.rongwe.zhsw.system.domain.SwMonthlyMeterReadingRecordDo;
+import com.rongwei.rwcommon.base.R;
+
+import javax.validation.Valid;
+import java.util.List;
+
+public interface SwMonthlyMeterReadingRecordService extends IService<SwMonthlyMeterReadingRecordDo> {
+
+    R receiveMonthlyMeterReading(@Valid List<SwMonthlyMeterReadingRecordDo> list) throws Exception;
+}

+ 188 - 0
zhsw-common/src/main/java/com/rongwei/zhsw/system/service/impl/SwMonthlyMeterReadingRecordServiceImpl.java

@@ -0,0 +1,188 @@
+package com.rongwei.zhsw.system.service.impl;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.rongwe.zhsw.system.domain.SwMonthlyMeterReadingRecordDo;
+import com.rongwe.zhsw.system.domain.SwUserManagementDo;
+import com.rongwe.zhsw.system.domain.SwWaterUsageEntryDo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.zhsw.system.dao.SwMonthlyMeterReadingRecordDao;
+import com.rongwei.zhsw.system.service.SwMonthlyMeterReadingRecordService;
+import com.rongwei.zhsw.system.service.SwWaterUsageEntryService;
+import com.rongwei.zhsw.system.utils.ZHSWCommonUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class SwMonthlyMeterReadingRecordServiceImpl extends ServiceImpl<SwMonthlyMeterReadingRecordDao, SwMonthlyMeterReadingRecordDo>
+        implements SwMonthlyMeterReadingRecordService {
+
+    private final Logger log = LoggerFactory.getLogger(this.getClass().getName());
+
+    @Autowired
+    private SwMonthlyMeterReadingRecordService swMonthlyMeterReadingRecordService;
+
+    @Autowired
+    private SwWaterUsageEntryService swWaterUsageEntryService;
+
+    @Autowired
+    private SwUserManagementServiceImpl swUserManagementService;
+
+    @Autowired
+    private BillGenerationServiceImpl billGenerationService;
+
+    @Override
+    public R receiveMonthlyMeterReading(List<SwMonthlyMeterReadingRecordDo> list) throws Exception {
+
+        //1. 校验传入参数是否为空,并且校验 RECORDID 是否唯一
+        validExistenceOrUniqueness(list);
+
+        LocalDateTime localDateTime =null;
+        for (SwMonthlyMeterReadingRecordDo recordDo:list){
+            recordDo.setId(SecurityUtil.getUUID());
+            // 转换为LocalDateTime
+            localDateTime = recordDo.getCurrentReadingDate().toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDateTime();
+            recordDo.setYear(localDateTime.getYear());
+            recordDo.setMonth(localDateTime.getMonthValue());
+            recordDo.setStatus("0");
+        }
+
+        //2.批量保存
+        swMonthlyMeterReadingRecordService.saveBatch(list,200);
+
+        Thread td = new Thread(() -> generateWaterRecordAter(list));
+        td.start();
+
+        return R.ok("数据接收成功");
+
+    }
+
+    //保存后生成抄表记录
+    private void generateWaterRecordAter(List<SwMonthlyMeterReadingRecordDo> list) {
+
+        log.info("保存后生成抄表记录");
+
+        List<SwMonthlyMeterReadingRecordDo> updateList = new ArrayList<>();
+        List<SwWaterUsageEntryDo> saveList = new ArrayList<>();
+
+        //2.参数按照 username 分组
+        Map<String, List<SwMonthlyMeterReadingRecordDo>> collect = list.stream().
+                collect(Collectors.groupingBy(SwMonthlyMeterReadingRecordDo::getUserNumber));
+
+
+        //1.获取所有的用户信息
+        List<SwUserManagementDo> users = swUserManagementService.list(new LambdaQueryWrapper<SwUserManagementDo>()
+                .eq(SwUserManagementDo::getDeleted,"0")
+                .in(SwUserManagementDo::getUsernumber, collect.keySet()));
+
+
+        Map<String, SwUserManagementDo> userMap = users.stream()
+                .collect(Collectors.groupingBy(
+                        SwUserManagementDo::getUsernumber,
+                        Collectors.collectingAndThen(
+                                Collectors.toList(),
+                                v -> v.get(0) // 取列表中的第一个元素
+                        )
+                ));
+
+        //填充数据
+        fillData(userMap,collect,saveList,updateList);
+
+        if (!saveList.isEmpty()){
+            swWaterUsageEntryService.saveBatch(saveList,200);
+        }
+
+        if (!updateList.isEmpty()){
+            swMonthlyMeterReadingRecordService.saveOrUpdateBatch(updateList,200);
+        }
+
+        billGenerationService.generateBill(saveList,userMap);
+
+    }
+
+    private void  fillData( Map<String, SwUserManagementDo> userMap , Map<String, List<SwMonthlyMeterReadingRecordDo>> collect,
+                           List<SwWaterUsageEntryDo> saveList, List<SwMonthlyMeterReadingRecordDo> updateList){
+
+        SysUserVo currentUser = ZHSWCommonUtils.getCurrentUser();
+        SwWaterUsageEntryDo swWaterUsageEntryDo = null;
+
+        for (String usernumber:collect.keySet()){
+
+            //用户的最后一次读表时间大于 参数 读表时间 跳过
+            if (userMap.get(usernumber).getLastmeterreaddate().getTime() > collect.get(usernumber).get(0).getCurrentReadingDate().getTime()){
+                log.error("本次抄表日期:{}小于用户表最后一次抄表日期:{}", userMap.get(usernumber).getLastmeterreaddate(), collect.get(usernumber).get(0).getCurrentReadingDate());
+                continue;
+            };
+            //填充数据
+            swWaterUsageEntryDo = new SwWaterUsageEntryDo();
+            swWaterUsageEntryDo.setId(SecurityUtil.getUUID());
+             ZHSWCommonUtils.initModelGeneralParameters(swWaterUsageEntryDo,currentUser);
+            swWaterUsageEntryDo.setUserid(userMap.get(usernumber).getId());
+            swWaterUsageEntryDo.setUsernumber(userMap.get(usernumber).getUsernumber());
+            swWaterUsageEntryDo.setUsername(userMap.get(usernumber).getUsername());
+            swWaterUsageEntryDo.setThisreading(collect.get(usernumber).get(0).getThisReading());
+            swWaterUsageEntryDo.setCurrentreadingdate(collect.get(usernumber).get(0).getCurrentReadingDate());
+            swWaterUsageEntryDo.setLastreading(userMap.get(usernumber).getLastmeterreading());
+            swWaterUsageEntryDo.setLastreadingdate(userMap.get(usernumber).getLastmeterreaddate());
+            swWaterUsageEntryDo.setCommunitycode(userMap.get(usernumber).getVolumeno());
+            swWaterUsageEntryDo.setCommunityname(userMap.get(usernumber).getVillagename());
+            swWaterUsageEntryDo.setAddress(userMap.get(usernumber).getAddress());
+            swWaterUsageEntryDo.setReadingsource("2"); // 默认2 在线抄表
+            swWaterUsageEntryDo.setYear(collect.get(usernumber).get(0).getYear());
+            swWaterUsageEntryDo.setMonth(collect.get(usernumber).get(0).getMonth());
+            swWaterUsageEntryDo.setState("0");
+            swWaterUsageEntryDo.setWaterusage(swWaterUsageEntryDo.getThisreading().subtract(swWaterUsageEntryDo.getLastreading()));
+            saveList.add(swWaterUsageEntryDo);
+
+            collect.get(usernumber).get(0).setWaterusageentryid(swWaterUsageEntryDo.getId());
+            collect.get(usernumber).get(0).setStatus("1");
+            updateList.add(collect.get(usernumber).get(0));
+        };
+
+    }
+
+
+
+    /**
+     * 校验传入参数是否为空,并且校验 RECORDID 是否唯一
+     *
+     * @param list
+     * @return
+     * @throws Exception
+     */
+    private void validExistenceOrUniqueness(List<SwMonthlyMeterReadingRecordDo> list) throws Exception {
+        // 判空
+        if (list == null || list.isEmpty()) {
+            throw new Exception("传入参数 list 为空");
+        }
+
+        Set<String> recordIdSet = new HashSet<>();
+
+        for (SwMonthlyMeterReadingRecordDo dto:list){
+            recordIdSet.add(dto.getRecordId());
+        }
+
+        if (recordIdSet.size() < list.size()) {
+            throw new Exception("传入参数 list RECORDID 重复");
+        }
+
+
+//        if(!swMonthlyMeterReadingRecordService.list(new LambdaQueryWrapper<SwMonthlyMeterReadingRecordDo>()
+//                .eq(SwMonthlyMeterReadingRecordDo::getDeleted, "0")
+//                .in(SwMonthlyMeterReadingRecordDo::getRecordId, recordIdSet)).isEmpty()){
+//            throw new Exception("传入参数 RECORDID 以重复发送");
+//
+//        }
+
+
+    }
+}

+ 136 - 0
zhsw-common/src/main/java/com/rongwei/zhsw/system/utils/JwtTokenUtil.java

@@ -0,0 +1,136 @@
+package com.rongwei.zhsw.system.utils;
+import com.alibaba.fastjson.JSON;
+import com.rongwei.commonservice.service.RedisService;
+import com.rongwei.rwadmincommon.system.vo.JwtAuthenticationRequest;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommonentity.commonservers.domain.TenantDo;
+import com.rongwei.zhsw.system.dao.CommonBusinessDao;
+import com.rongwei.zhsw.system.fegin.LoginAuth;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 獲取 token
+ */
+@Component
+@RequestMapping("/jwtToken")
+public class JwtTokenUtil  {
+
+    private static final Logger log = LoggerFactory.getLogger(JwtTokenUtil.class);
+
+    @Autowired
+    private CommonBusinessDao commonBusinessDao;
+
+    @Autowired
+    private LoginAuth loginAuth;
+
+    @Autowired
+    private RedisService redisService;
+
+
+    @PostMapping("/getToken")
+    @ResponseBody
+    public R generateToken(
+            @RequestHeader("clientId") String clientId,
+            @RequestHeader("client_secret") String clientSecret) {
+
+        String token ="";
+
+        try {
+
+            // 验证和处理逻辑
+            if (clientId == null || clientSecret == null) {
+                return R.error("Missing clientId or client_secret");
+            }
+
+            //3. 查询主库对应数据的 clientSecret 是否正确
+            List<TenantDo> tenantDos = commonBusinessDao.getByDsKey(clientId, "0");
+            if (!tenantDos.isEmpty()){
+                String roption = tenantDos.get(0).getRoption();
+                if (StringUtils.isNotBlank(roption)
+                        && JSON.parseObject(roption).getOrDefault("client_secret","").equals(clientSecret)
+                ){
+                    token = addToken(tenantDos);
+                    return R.ok().putData(token);
+                }
+
+            }
+
+        }catch (Exception e ){
+            return R.error().putData("clientId,client_secret 不正确");
+        }
+
+
+        return R.error().putData("clientId,client_secret 不正确");
+
+    }
+
+    private String addToken(List<TenantDo> tenantDos) {
+        //1.创建用户
+        SysUserVo sysUserVo = new SysUserVo();
+        sysUserVo.setId(SecurityUtil.getUUID());
+        sysUserVo.setAccount("systemAccount");
+        sysUserVo.setName("系统管理员");
+
+        TenantDo tenantDo = new TenantDo();
+
+            tenantDo.setDskey(tenantDos.get(0).getDskey());
+            tenantDo.setId(tenantDos.get(0).getId());
+
+        sysUserVo.setTenantDo(tenantDo);
+
+
+        // token生成
+        JwtAuthenticationRequest jwtAuthenticationRequest = new JwtAuthenticationRequest(sysUserVo.getId(), sysUserVo.getAccount(), sysUserVo.getName());
+
+        Map<String, Object> tokenmap = loginAuth.getTokenInfo(jwtAuthenticationRequest);
+        String token = (String) tokenmap.get("token");
+        if ("ServerAbnormal".equals(token)) {
+            throw new CustomException("认证服务异常");
+        }
+
+        //redis缓存登录用户信息
+        redisService.setLoginUser(token, sysUserVo);
+        return  token;
+    }
+
+
+    public static void main(String[] args) {
+        String baseString = "zhsw00001";
+        String fixedString = "rongwei"; // Replace with your fixed string
+        String clientSecret = generateClientSecret(baseString, fixedString);
+        System.out.println("Generated client_secret: " + clientSecret);
+    }
+
+    public static String generateClientSecret(String baseString, String fixedString) {
+        try {
+            // Combine the base string and the fixed string
+            String combinedString = baseString + fixedString;
+
+            // Create a SHA-256 hash of the combined string
+            MessageDigest digest = MessageDigest.getInstance("SHA-256");
+            byte[] hashBytes = digest.digest(combinedString.getBytes());
+
+            // Convert the hash bytes to a Base64 encoded string
+            return Base64.getEncoder().encodeToString(hashBytes);
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("SHA-256 algorithm not found", e);
+        }
+    }
+
+}

+ 6 - 0
zhsw-entity/pom.xml

@@ -38,5 +38,11 @@
             <artifactId>rw-common-utils</artifactId>
             <version>1.1-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.checkerframework</groupId>
+            <artifactId>checker-qual</artifactId>
+            <version>3.12.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 124 - 0
zhsw-entity/src/main/java/com/rongwe/zhsw/system/domain/SwMonthlyMeterReadingRecordDo.java

@@ -0,0 +1,124 @@
+package com.rongwe.zhsw.system.domain;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+@TableName("sw_monthly_meter_reading_record")
+public class SwMonthlyMeterReadingRecordDo implements Serializable {
+
+    /**
+     * 主键ID
+     */
+    private String id;
+
+    /**
+     * 租户ID
+     */
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    private String roption;
+    /**
+     * 是否删除Y/N
+     */
+    private String deleted;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 创建时间
+     */
+    private Date createdate;
+    /**
+     * 创建用户ID
+     */
+    private String createuserid;
+    /**
+     * 修改日期
+     */
+    private Date modifydate;
+    /**
+     * 修改用户ID
+     */
+    private String modifyuserid;
+    /**
+     * 创建人
+     */
+    private String createusername;
+    /**
+     * 修改人
+     */
+    private String modifyusername;
+
+    /**
+     * 记录ID
+     */
+    @NotBlank(message = "RECORDID 不能为空")
+    @JsonProperty("RECORDID")
+    private String recordId;
+    /**
+     * 户号
+     */
+    @NotBlank(message = "USERNUMBER 不能为空")
+    @JsonProperty("USERNUMBER")
+    private String userNumber;
+    /**
+     * 表号
+     */
+    @NotBlank(message = "WATERMETERCODE 不能为空")
+    @JsonProperty("WATERMETERCODE")
+    private String waterMeterCode;
+    /**
+     * 本次抄表读数
+     */
+    @NotNull(message = "THISREADING 不能为空")
+    @JsonProperty("THISREADING")
+    private BigDecimal thisReading;
+    /**
+     * 本次抄表日期
+     */
+    @NotNull(message = "CURRENTREADINGDATE 不能为空")
+    @JsonProperty("CURRENTREADINGDATE")
+    private Date currentReadingDate;
+    /**
+     * 抄表来源
+     */
+    @NotBlank(message = "READINGSOURCE 不能为空")
+    @JsonProperty("READINGSOURCE")
+    private String readingSource;
+
+
+    /**
+     * 年
+     */
+    private int year;
+
+    /**
+     * 月
+     */
+    private int month;
+
+    /**
+     * 生成抄表记录ID
+     */
+    private String waterusageentryid;
+
+    /**
+     * 状态(0:未生成账单,1:已生成报表记录
+     */
+    private String status;
+
+
+}

+ 58 - 0
zhsw-server/src/main/java/com/rongwei/zhsw/config/GlobalExceptionHandler.java

@@ -0,0 +1,58 @@
+package com.rongwei.zhsw.config;
+
+import com.rongwei.rwcommon.base.R;
+import com.rongwei.zhsw.system.controller.SwMonthlyMeterReadingRecordController;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component("globalExceptionHandler1") // 指定 Bean 名称
+@RestControllerAdvice(basePackages="com.rongwei.zhsw.system.controller",assignableTypes = {SwMonthlyMeterReadingRecordController.class})
+
+public class GlobalExceptionHandler {
+
+    /**
+     * 处理所有 @Valid 参数校验失败异常
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public R handleValidationException(MethodArgumentNotValidException ex) {
+        Map<String, String> errors = new HashMap<>();
+        ex.getBindingResult().getAllErrors().forEach(error -> {
+            String fieldName = ((FieldError) error).getField();
+            String message = error.getDefaultMessage();
+            errors.put(fieldName, message);
+        });
+        return R.error("400", "参数校验失败").putData( errors);
+    }
+
+    /**
+     * 处理List校验异常(新增)
+     */
+    @ExceptionHandler(ConstraintViolationException.class)
+    public R handleConstraintViolation(ConstraintViolationException ex) {
+        Map<String, String> errors = ex.getConstraintViolations()
+                .stream()
+                .collect(Collectors.toMap(
+                        v -> v.getPropertyPath().toString(),
+                        ConstraintViolation::getMessage
+                ));
+        return R.error("400", "列表参数校验失败").putData(errors);
+    }
+
+
+    /**
+     * 兜底异常处理
+     */
+    @ExceptionHandler(Exception.class)
+    public R handleException(Exception ex) {
+        return R.error("服务器异常,请联系管理员!");
+    }
+}

+ 41 - 0
zhsw-server/src/main/java/com/rongwei/zhsw/system/controller/SwMonthlyMeterReadingRecordController.java

@@ -0,0 +1,41 @@
+package com.rongwei.zhsw.system.controller;
+import com.rongwe.zhsw.system.domain.SwMonthlyMeterReadingRecordDo;
+import com.rongwei.rwcommon.base.R;
+import com.rongwei.zhsw.system.service.SwMonthlyMeterReadingRecordService;
+import com.rongwei.zhsw.system.service.SwWaterUsageEntryService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import javax.validation.Valid;
+import java.util.List;
+
+
+@RestController
+@Validated
+@RequestMapping("/swMonthlyMeterReadingRecord")
+
+public class SwMonthlyMeterReadingRecordController {
+
+    private static final Logger log = LoggerFactory.getLogger(SwMonthlyMeterReadingRecordController.class);
+
+
+    @Autowired
+    SwMonthlyMeterReadingRecordService swMonthlyMeterReadingRecordService;
+
+    @PostMapping("/receiveMonthlyMeterReading")
+    @ResponseBody
+    public R receiveMonthlyMeterReading(@Valid @RequestBody List<SwMonthlyMeterReadingRecordDo> list ) {
+
+        log.info("每月抄表数据接收接口开始调用,接收条数: {}",list.size());
+
+        try {
+            return swMonthlyMeterReadingRecordService.receiveMonthlyMeterReading(list);
+
+        }catch (Exception e){
+            log.error("数据接受失败 {}",e.getMessage());
+            return R.error("数据接收失败");
+        }
+    }
+}