Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

luoyb 1 vuosi sitten
vanhempi
commit
429a6c652c

+ 6 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/CreditTypeEnum.java

@@ -126,7 +126,12 @@ public enum CreditTypeEnum {
     /**
      * 错扣补款
      */
-    ERROR_FILL(25010, "错扣补款");
+    ERROR_FILL(25010, "错扣补款"),
+
+    /**
+     * 手工消费,常用于导入消费记录
+     */
+    HAND_CONSUME(25020, "手工消费");
 
     private final Integer code;
     private final String message;

+ 54 - 4
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/controller/XfConsumeDetailController.java

@@ -1,21 +1,28 @@
 package org.dromara.backstage.consumption.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.util.ObjectUtil;
 import com.itextpdf.kernel.geom.PageSize;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
+import org.dromara.backstage.consumption.domain.bo.HandImportConsumeBo;
+import org.dromara.backstage.consumption.domain.bo.HandImportExcelConsumeBo;
 import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeAnalyzeVo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailCKBKVo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
 import org.dromara.backstage.consumption.service.IXfConsumeDetailService;
+import org.dromara.common.core.config.DefaultConfig;
+import org.dromara.common.core.constant.DefaultConstants;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.pdf.PdfUtil;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.excel.core.ExcelResult;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
@@ -25,16 +32,16 @@ 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.beans.factory.annotation.Value;
+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.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * 消费明细
@@ -51,6 +58,8 @@ public class XfConsumeDetailController extends BaseController {
 
     private final IXfConsumeDetailService xfConsumeDetailService;
 
+    private final DefaultConfig defaultConfig;
+
     /**
      * 查询消费明细列表
      */
@@ -218,4 +227,45 @@ public class XfConsumeDetailController extends BaseController {
         }
 
     }
+
+    // 导出模板 一个接口
+    @SaCheckPermission("consumption:xfConsumedetail:export")
+    @GetMapping("/exportTemplate")
+    public void exportTemplate(HttpServletResponse response) {
+        List<HandImportExcelConsumeBo> list = new ArrayList<>();
+        HandImportExcelConsumeBo handImportExcelConsumeBo = new HandImportExcelConsumeBo();
+        handImportExcelConsumeBo.setEmployeeStrID("15674973711");
+        handImportExcelConsumeBo.setConsumeDate("2023-05-01 12:00:00");
+        handImportExcelConsumeBo.setTermID("56");
+        handImportExcelConsumeBo.setConsumeValue("10");
+        ExcelUtil.exportExcel(list, "消费明细导入模板", HandImportExcelConsumeBo.class, response);
+    }
+    // 解析excel数据 一个接口
+    @Log(title = "解析导入的消费明细数据", businessType = BusinessType.IMPORT)
+    @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    @SaCheckPermission("consumption:xfConsumedetail:export")
+    public R<List<HandImportExcelConsumeBo>> importData(@RequestPart("file") MultipartFile file) throws Exception {
+        ExcelResult<HandImportExcelConsumeBo> excelResult = ExcelUtil.importExcel(file.getInputStream(), HandImportExcelConsumeBo.class, true);
+        List<HandImportExcelConsumeBo> volist = excelResult.getList();
+        return R.ok(volist);
+    }
+
+    // 导入数据 一个接口 (模拟消费机消费) http://172.16.137.72/prod-api/consume/v1/Consumes/ConsumeOriginal
+    // http://172.16.137.72/prod-api/consume/v1/Consumes/Consume
+    @Log(title = "消费明细导入", businessType = BusinessType.IMPORT)
+    @PostMapping("/importConsumedetail")
+    @SaCheckPermission("consumption:xfConsumeDetail:add")
+    public R<List<HandImportConsumeBo>> importConsumedetail(@RequestBody List<HandImportExcelConsumeBo> list) {
+        if (ObjectUtil.isNotEmpty(defaultConfig.getLocationFlag()) && ObjectUtil.equals(defaultConfig.getLocationFlag(), DefaultConstants.LOCAL_FLAG)) {
+            if (list.size() > 0) {
+                return R.ok(xfConsumeDetailService.importConsumeDetailList(list));
+            }
+        }else{
+            return R.fail("只能在校内本地服务执行!");
+        }
+
+        return R.ok("参数为空数组");
+    }
+
+
 }

+ 45 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/HandImportConsumeBo.java

@@ -0,0 +1,45 @@
+package org.dromara.backstage.consumption.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ExcelIgnoreUnannotated
+public class HandImportConsumeBo extends HandImportExcelConsumeBo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -3665821894748334325L;
+
+    // consumeDate、consumeValue、employeeStrID、posRecordState、termID、termRecordID随机、statusFlag 3、useTpye 25020
+
+    // 364
+    private String posRecordState;
+
+    // 随机生成
+    private String termRecordID;
+
+    // 3
+    private String statusFlag;
+
+    /**
+     * 手工消费类型 25020
+     */
+    private String creditType;
+
+    /**
+     * 消费结果
+     */
+    private String result;
+
+    /**
+     * 消费失败原因
+     */
+    private String reason;
+}

+ 39 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/domain/bo/HandImportExcelConsumeBo.java

@@ -0,0 +1,39 @@
+package org.dromara.backstage.consumption.domain.bo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@ExcelIgnoreUnannotated
+public class HandImportExcelConsumeBo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -3213021053686386305L;
+
+    // consumeDate、consumeValue、employeeStrID、posRecordState、termID、termRecordID随机、statusFlag 3、useTpye 25020
+
+    // user_numb 学工号 employeeStrID
+    @NotBlank(message = "学工号不能为空")
+    @ExcelProperty(value = "学工号")
+    private String employeeStrID;
+    // 消费日期
+    @NotBlank(message = "消费日期不能为空")
+    @ExcelProperty(value = "消费日期")
+    private String consumeDate;
+    // 消费金额
+    @NotBlank(message = "消费金额不能为空")
+    @ExcelProperty(value = "消费金额")
+    private String consumeValue;
+    // 设备ID
+    @NotBlank(message = "设备机号不能为空")
+    @ExcelProperty(value = "设备机号")
+    private String termID;
+
+    private String employeeName;
+
+}

+ 9 - 0
ruoyi-modules/ruoyi-backstage/src/main/java/org/dromara/backstage/consumption/service/IXfConsumeDetailService.java

@@ -1,5 +1,7 @@
 package org.dromara.backstage.consumption.service;
 
+import org.dromara.backstage.consumption.domain.bo.HandImportConsumeBo;
+import org.dromara.backstage.consumption.domain.bo.HandImportExcelConsumeBo;
 import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeAnalyzeVo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailCKBKVo;
@@ -103,4 +105,11 @@ public interface IXfConsumeDetailService {
                                                  String roomIds,
                                                  String consumeDateBegin, String consumeDateEnd);
 
+    /**
+     * 导入消费明细数据
+     * @param list 导入结果
+     * @return
+     */
+    List<HandImportConsumeBo> importConsumeDetailList(List<HandImportExcelConsumeBo> list);
+
 }

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

@@ -1,13 +1,20 @@
 package org.dromara.backstage.consumption.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.seata.common.util.CollectionUtils;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.dromara.backstage.consumption.domain.XfConsumeDetail;
+import org.dromara.backstage.consumption.domain.bo.HandImportConsumeBo;
+import org.dromara.backstage.consumption.domain.bo.HandImportExcelConsumeBo;
 import org.dromara.backstage.consumption.domain.bo.XfConsumeDetailBo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeAnalyzeVo;
 import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailCKBKVo;
@@ -15,11 +22,13 @@ import org.dromara.backstage.consumption.domain.vo.XfConsumeDetailVo;
 import org.dromara.backstage.consumption.mapper.XfConsumeDetailMapper;
 import org.dromara.backstage.consumption.service.IXfConsumeDetailService;
 import org.dromara.common.core.enums.ConsumeRecordTypeEnum;
+import org.dromara.common.core.enums.CreditTypeEnum;
 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.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.time.YearMonth;
@@ -35,10 +44,15 @@ import java.util.stream.Collectors;
  */
 @RequiredArgsConstructor
 @Service
+@Slf4j
 public class XfConsumeDetailServiceImpl implements IXfConsumeDetailService {
 
     private final XfConsumeDetailMapper baseMapper;
 
+    // http://172.16.137.72/prod-api/consume
+    @Value("${XF_CONSUME_URL:http://localhost:8080/consume}")
+    private String XF_CONSUME_URL;
+
     /**
      * 查询消费明细
      *
@@ -292,4 +306,78 @@ public class XfConsumeDetailServiceImpl implements IXfConsumeDetailService {
             beginDate, endDate));
     }
 
+    /**
+     * 导入消费明细数据
+     *
+     * (模拟消费机消费) http://172.16.137.72/prod-api/consume/v1/Consumes/ConsumeOriginal
+     *     // http://172.16.137.72/prod-api/consume/v1/Consumes/Consume
+     *
+     * @param list 导入结果
+     * @return
+     */
+    @Override
+    public List<HandImportConsumeBo> importConsumeDetailList(List<HandImportExcelConsumeBo> list) {
+        List<HandImportConsumeBo> rs = new ArrayList<>(list.size());
+        for (int i = 0; i < list.size(); i++) {
+            HandImportExcelConsumeBo handImportExcelConsumeBo = list.get(i);
+            HandImportConsumeBo bo = new HandImportConsumeBo();
+            rs.add(bo);
+            bo.setConsumeDate(handImportExcelConsumeBo.getConsumeDate());
+            bo.setConsumeValue(handImportExcelConsumeBo.getConsumeValue());
+            bo.setEmployeeStrID(handImportExcelConsumeBo.getEmployeeStrID());
+            bo.setTermID(handImportExcelConsumeBo.getTermID());
+
+            bo.setCreditType(CreditTypeEnum.HAND_CONSUME.code().toString());
+            bo.setStatusFlag("3");
+            bo.setPosRecordState("364");
+            bo.setTermRecordID(String.valueOf(i));
+
+            // 调用消费接口
+            // http://172.16.137.72/prod-api/consume/v1/Consumes/ConsumeOriginal
+            // 使用hutool工具包的http请求工具类 发送post请求
+            HttpRequest httpRequest = HttpRequest.post(XF_CONSUME_URL+"/v1/Consumes/ConsumeOriginal")
+                .body(JSONUtil.toJsonStr(bo));
+            log.info("请求ConsumeOriginal开始:{}",httpRequest.toString());
+            HttpResponse result = httpRequest.execute();
+            log.info("请求ConsumeOriginal返回:{}", result.toString());
+            String resBody = result.body();
+            if(StringUtils.isBlank(resBody)){
+                bo.setResult("失败");
+                bo.setReason("ConsumeOriginal请求失败,返回为空");
+                continue;
+            }
+            JSONObject jsonObject = JSONUtil.parseObj(resBody);
+            String employeeStrID = jsonObject.getStr("employeeStrID");
+            if(StringUtils.isBlank(employeeStrID)){
+                bo.setResult("失败");
+                bo.setReason(resBody);
+                continue;
+            }
+            bo.setEmployeeName(jsonObject.getStr("employeeName"));
+
+            // http://172.16.137.72/prod-api/consume/v1/Consumes/Consume
+            HttpRequest httpRequestAgain = HttpRequest.post(XF_CONSUME_URL+"/v1/Consumes/Consume")
+                .body(resBody);
+            log.info("请求Consume开始:{}",httpRequestAgain.toString());
+            HttpResponse resultAgain = httpRequestAgain.execute();
+            log.info("请求Consume返回:{}", resultAgain.toString());
+            String resBodyAgain = resultAgain.body();
+            if(StringUtils.isBlank(resBodyAgain)){
+                bo.setResult("失败");
+                bo.setReason("Consume请求失败,返回为空");
+                continue;
+            }
+            JSONObject jsonObjectAgain = JSONUtil.parseObj(resBodyAgain);
+            String employeeStrIDAgain = jsonObjectAgain.getStr("employeeStrID");
+            if(StringUtils.isBlank(employeeStrIDAgain)){
+                bo.setResult("失败");
+                bo.setReason(resBody);
+                continue;
+            }
+            bo.setResult("成功");
+
+        }
+        return rs;
+    }
+
 }

+ 2 - 2
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/controller/v1/ConsumeController.java

@@ -146,9 +146,9 @@ public class ConsumeController {
         }
         ConsumptionBo bo = recordConvertStrategy.convert(record, "YC");
         ConsumptionBo cloudConsumeBo = BeanUtil.copyProperties(bo, ConsumptionBo.class);
-        bo.setStatusFlag(4);
+//        bo.setStatusFlag(4);
         bo.setUseType(SystemUseTypeEnum.CONSUME);
-        bo.setCreditType(CreditTypeEnum.TERM_CONSUME);
+//        bo.setCreditType(CreditTypeEnum.TERM_CONSUME);
 
         R<ErrorInfo> errorInfo;
         if (Objects.equals(type, "requestConsume")) {

+ 13 - 0
ruoyi-server/ruoyi-server-consume/src/main/java/org/dromara/server/consume/convert/strategy/impl/YcRecordConvertStrategyImpl.java

@@ -7,6 +7,7 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.constant.DefaultConstants;
+import org.dromara.common.core.enums.CreditTypeEnum;
 import org.dromara.server.common.domain.consume.bo.ConsumptionBo;
 import org.dromara.server.common.util.CardDateUtils;
 import org.dromara.server.consume.constant.TermSupplierConstants;
@@ -52,6 +53,18 @@ public class YcRecordConvertStrategyImpl implements IRecordConvertStrategy {
             consumptionBo.setRecordId(ObjectUtil.isEmpty(yc.get("oriRecordID")) ? null : Long.parseLong(yc.get("oriRecordID").toString()));
             consumptionBo.setRecordStatus(ObjectUtil.isEmpty(yc.get("posRecordState")) ? 0 : Long.parseLong(yc.get("posRecordState").toString()));
             consumptionBo.setOperatorId(ObjectUtil.isEmpty(yc.get("operatorID")) ? 0 : Long.parseLong(yc.get("operatorID").toString()));
+            //StatusFlag
+            if(ObjectUtil.isNotEmpty(yc.get("statusFlag"))){
+                consumptionBo.setStatusFlag(Integer.parseInt(yc.get("statusFlag").toString()));
+            }else{
+                consumptionBo.setStatusFlag(4);
+            }
+            //CreditType
+            if(ObjectUtil.isNotEmpty(yc.get("creditType"))){
+                consumptionBo.setCreditType(CreditTypeEnum.fromCode(Integer.parseInt(yc.get("creditType").toString())));
+            }else{
+                consumptionBo.setCreditType(CreditTypeEnum.TERM_CONSUME);
+            }
 
             return consumptionBo;
         }