瀏覽代碼

通过Excel导入用户水费及抄表表数等其他字段接口处理

王苗苗 2 月之前
父節點
當前提交
40412659b0

+ 28 - 5
slibra-admin/src/main/java/com/slibra/web/controller/business/ExcelController.java

@@ -6,10 +6,7 @@ import com.slibra.business.domain.*;
 import com.slibra.business.mapper.*;
 import com.slibra.business.req.AiChatReq;
 import com.slibra.business.req.AiChatRes;
-import com.slibra.business.res.BZXQLHInfo;
-import com.slibra.business.res.MoreExcelInfo;
-import com.slibra.business.res.UpdateUserExcelInfo;
-import com.slibra.business.res.UserExcelInfo;
+import com.slibra.business.res.*;
 import com.slibra.business.service.IFrontService;
 import com.slibra.common.core.controller.BaseController;
 import com.slibra.common.core.domain.AjaxResult;
@@ -20,6 +17,7 @@ import com.slibra.common.utils.StringUtils;
 import com.slibra.common.utils.poi.ExcelUtil;
 import com.slibra.web.controller.listener.MoreDataListener;
 import com.slibra.web.controller.listener.UpdateUserDataListener;
+import com.slibra.web.controller.listener.UpdateUserFeeListener;
 import com.slibra.web.controller.listener.UserDataListener;
 import io.micrometer.core.annotation.Timed;
 import lombok.extern.slf4j.Slf4j;
@@ -281,7 +279,7 @@ public class ExcelController extends BaseController {
      *
      */
     @PostMapping(value = "/updateUserInfoFromExcel")
-    public R<String> upLoadImage(@RequestParam("file") MultipartFile file) {
+    public R<String> updateUserInfoFromExcel(@RequestParam("file") MultipartFile file) {
         log.info("进入了通过上传Excel,获取户号更新用户手机号的操作");
         if (file.isEmpty())
             throw new ServiceException("请上传Excel文件!");
@@ -314,6 +312,31 @@ public class ExcelController extends BaseController {
 
 
 
+    /**
+     *
+     * 前端上传一个Excel数据,获取到里面的用户编号和抄表表数、欠费金额和截止统计时间,通过编号查询用户然后再更新抄表表数、欠费金额和截止统计时间;同时把查询失败的用户记录下来,写成文件,返回给前端。
+     *
+     *
+     */
+    @PostMapping(value = "/updateUserFeeInfoFromExcel")
+    public R<String> updateUserFeeInfoFromExcel(@RequestParam("file") MultipartFile file) {
+        log.info("进入了通过上传Excel,获取户号更新用户水费的操作");
+        if (file.isEmpty())
+            throw new ServiceException("请上传Excel文件!");
+        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.SIMPLE, false);
+        TUserInfoMapper sqlSessionMapper = sqlSession.getMapper(TUserInfoMapper.class);
+        TImportFailMapper failMapper = sqlSession.getMapper(TImportFailMapper.class);
+        // 读取Excel文件
+        try {
+            EasyExcel.read(file.getInputStream(), UserFeeExcelInfo.class, new UpdateUserFeeListener(sqlSession, sqlSessionMapper, failMapper))
+                    .sheet() // 读取第一个工作表
+                    .doRead(); // 触发实际的读取操作
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return R.ok("上传成功");
+    }
+
 
 
 }

+ 116 - 0
slibra-admin/src/main/java/com/slibra/web/controller/listener/UpdateUserFeeListener.java

@@ -0,0 +1,116 @@
+package com.slibra.web.controller.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.fastjson2.JSON;
+import com.slibra.business.domain.TImportFail;
+import com.slibra.business.domain.TUserInfo;
+import com.slibra.business.mapper.TImportFailMapper;
+import com.slibra.business.mapper.TUserInfoMapper;
+import com.slibra.business.res.UpdateUserExcelInfo;
+import com.slibra.business.res.UserFeeExcelInfo;
+import com.slibra.common.utils.DateUtils;
+import com.slibra.common.utils.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.ibatis.session.SqlSession;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+@Component
+@Slf4j
+public class UpdateUserFeeListener extends AnalysisEventListener<UserFeeExcelInfo> {
+
+    SqlSession sqlSession;
+    TUserInfoMapper tUserInfoMapper;
+    TImportFailMapper tImportFailMapper;
+
+    //成功数量
+    private int successNum = 0;
+
+    //失败数量
+    private int failNum = 0;
+
+    //失败数据列表
+    private List<UserFeeExcelInfo> failList = new ArrayList<>();
+
+    @Override
+    public void invoke(UserFeeExcelInfo userExcelInfo, AnalysisContext context) {
+        //查询 如果2个有一个为空的,就标记为错误
+        String userNo = userExcelInfo.getUserNo();
+        BigDecimal waterFees = userExcelInfo.getWaterFees();
+        if(StringUtils.isBlank(userNo) || Objects.isNull(waterFees)){
+            log.info("存在为空的数据,无法更新");
+            failNum ++;
+            failList.add(userExcelInfo);
+            return;
+        }
+        //都存在
+        //通过编号查询用户数据,如果存在就更新并记录成功数量,不存在标记错误。
+        //2025年01月22日14:25:34 还是用这种,然后改成非批量,否则拿不到错误记录
+        List<TUserInfo> tUserInfos = this.tUserInfoMapper.selectTUserInfoList(TUserInfo.builder().userNo(userNo).build());
+        if(CollectionUtils.isEmpty(tUserInfos)){
+            log.info("通过用户编号未查询到用户明细");
+            failNum ++;
+            failList.add(userExcelInfo);
+        }else {
+            TUserInfo tUserInfo = tUserInfos.get(0);
+            TUserInfo updateBean = new TUserInfo();
+            updateBean.setId(tUserInfo.getId());
+            updateBean.setWaterFees(waterFees);
+            updateBean.setMeterAmount(userExcelInfo.getMeterAmount());
+            updateBean.setStatisticsTime(userExcelInfo.getStatisticsTime());
+            updateBean.setUpdateTime(DateUtils.getNowDate());
+            updateBean.setUpdateBy("system");
+            this.tUserInfoMapper.updateTUserInfo(updateBean);
+            successNum++;
+        }
+        //2025年01月15日16:22:17 逻辑调整 直接通过name更新,如果返回调试是1,则代表成功;
+        /*int size = this.tUserInfoMapper.updateUserPhoneByNo(phone, userNo);
+        if(size != 0){//成功
+            successNum++;
+        }else{
+            log.info("通过用户编号未查询到用户明细,更新失败");
+            failNum ++;
+            failList.add(userExcelInfo);
+        }*/
+
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        // 所有数据读取完毕后的处理逻辑
+        log.info("所有数据读取完毕");
+        Date nowDate = DateUtils.getNowDate();
+
+        //记录失败数据情况
+        TImportFail tImportFail = new TImportFail();
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("time", DateUtils.getTime());
+        map.put("failNum", failNum);
+        map.put("successNum", successNum);
+        map.put("failList", failList);
+        tImportFail.setType(1);
+        tImportFail.setContent(JSON.toJSONString(map));
+        tImportFail.setCreateTime(nowDate);
+        tImportFail.setCreateBy("system");
+        this.tImportFailMapper.insertTImportFail(tImportFail);
+        sqlSession.commit();
+        sqlSession.close();
+    }
+
+    public UpdateUserFeeListener() {
+    }
+
+
+    public UpdateUserFeeListener(SqlSession sqlSession, TUserInfoMapper tUserInfoMapper, TImportFailMapper tImportFailMapper) {
+        this.sqlSession = sqlSession;
+        this.tUserInfoMapper = tUserInfoMapper;
+        this.tImportFailMapper = tImportFailMapper;
+    }
+
+
+
+}

+ 43 - 0
slibra-system/src/main/java/com/slibra/business/res/UserFeeExcelInfo.java

@@ -0,0 +1,43 @@
+package com.slibra.business.res;
+
+import com.slibra.common.annotation.Excel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 用户信息对象 t_user_info
+ * 
+ * @author slibra
+ * @date 2024-11-06
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserFeeExcelInfo
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 用户编号 */
+    @Excel(name = "用户编号")
+    private String userNo = "";
+
+    /** 抄表表数 */
+    @Excel(name = "抄表表数")
+    private BigDecimal meterAmount;
+
+    /** 截止最近欠费 */
+    @Excel(name = "截止最近欠费")
+    private BigDecimal waterFees;
+
+    /** 截止统计时间 */
+    @Excel(name = "截止统计时间")
+    private Date statisticsTime;
+
+
+}