瀏覽代碼

学校功能

TRX 1 年之前
父節點
當前提交
8d74415ed2

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/ExpenseFlowCount.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.model.payment;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * 统计
+ *
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExpenseFlowCount {
+    private BigDecimal payAmount = BigDecimal.ZERO;
+}

+ 52 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/ExpenseFlowModel.java

@@ -0,0 +1,52 @@
+package com.zhongshu.card.client.model.payment;
+
+import cn.hutool.json.JSONObject;
+import com.zhongshu.card.client.model.base.SuperModel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExpenseFlowModel extends SuperModel {
+    @Schema(description = "用户userId")
+    private String userId;
+
+    @Schema(description = "消费类型,如:餐饮消费")
+    private String payType;
+
+    @Schema(description = "年份,如:2024")
+    private String year;
+
+    @Schema(description = "月份,如06")
+    private String month;
+
+    @Schema(description = "消费订单号")
+    private String orderNo;
+
+    @Schema(description = "支付订单号")
+    private String paymentNo;
+
+    @Schema(description = "消费时间")
+    private String paymentTime;
+
+    @Schema(description = "支付方式")
+    private String paymentWay;
+
+    @Schema(description = "消费金额(单位:分)")
+    private BigDecimal payAmount;
+
+    @Schema(description = "关联信息")
+    private JSONObject goodsInfo;
+
+    @Schema(description = "支付订单状态")
+    private String paymentStatus;
+}

+ 52 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/ExpenseFlowParam.java

@@ -0,0 +1,52 @@
+package com.zhongshu.card.client.model.payment;
+
+import cn.hutool.json.JSONObject;
+import com.zhongshu.card.client.model.base.SuperParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExpenseFlowParam extends SuperParam {
+    @Schema(description = "用户userId")
+    private String userId;
+
+    @Schema(description = "消费类型,如:餐饮消费")
+    private String payType;
+
+    @Schema(description = "年份,如:2024")
+    private String year;
+
+    @Schema(description = "月份,如06")
+    private String month;
+
+    @Schema(description = "消费订单号")
+    private String orderNo;
+
+    @Schema(description = "支付订单号")
+    private String paymentNo;
+
+    @Schema(description = "消费时间")
+    private String paymentTime;
+
+    @Schema(description = "支付方式")
+    private String paymentWay;
+
+    @Schema(description = "消费金额(单位:分)")
+    private BigDecimal payAmount;
+
+    @Schema(description = "关联信息")
+    private JSONObject goodsInfo;
+
+    @Schema(description = "支付订单状态")
+    private String paymentStatus;
+}

+ 64 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/payment/ExpenseFlowSearch.java

@@ -0,0 +1,64 @@
+package com.zhongshu.card.client.model.payment;
+
+import cn.hutool.json.JSONObject;
+import com.zhongshu.card.client.model.base.SuperSearch;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+
+/**
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ExpenseFlowSearch extends SuperSearch {
+    @Schema(description = "用户userId")
+    private String userId;
+
+    @Schema(description = "消费类型,如:餐饮消费")
+    private String payType;
+
+    @Schema(description = "年份,如:2024")
+    private String year;
+
+    @Schema(description = "月份,如06")
+    private String month;
+
+    public String getMonth() {
+        if (StringUtils.isNotEmpty(month)) {
+            if (month.length() == 2) {
+                return month;
+            } else {
+                return String.format("0%s", month);
+            }
+        }
+        return month;
+    }
+
+    @Schema(description = "消费订单号")
+    private String orderNo;
+
+    @Schema(description = "支付订单号")
+    private String paymentNo;
+
+    @Schema(description = "消费时间")
+    private String paymentTime;
+
+    @Schema(description = "支付方式")
+    private String paymentWay;
+
+    @Schema(description = "消费金额(单位:分)")
+    private BigDecimal payAmount;
+
+    @Schema(description = "关联信息")
+    private JSONObject goodsInfo;
+
+    @Schema(description = "支付订单状态")
+    private String paymentStatus;
+}

+ 22 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/service/payment/ExpenseFlowService.java

@@ -0,0 +1,22 @@
+package com.zhongshu.card.client.service.payment;
+
+import com.zhongshu.card.client.model.payment.ExpenseFlowCount;
+import com.zhongshu.card.client.model.payment.ExpenseFlowModel;
+import com.zhongshu.card.client.model.payment.ExpenseFlowSearch;
+import com.zhongshu.card.client.ret.ResultContent;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @author TRX
+ * @date 2024/6/17
+ */
+public interface ExpenseFlowService {
+
+    ResultContent<Page<ExpenseFlowModel>> page(ExpenseFlowSearch param, Pageable pageable);
+
+    ResultContent<ExpenseFlowCount> countPayment(ExpenseFlowSearch param);
+
+    ResultContent<ExpenseFlowModel> getDetail(String id);
+
+}

+ 20 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/ExpenseFlowDao.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.server.core.dao.payment;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.payment.extend.ExpenseFlowDaoExtend;
+import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
+import com.zhongshu.card.server.core.domain.school.Area;
+
+import java.util.List;
+
+/**
+ * 消费流水Dao
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface ExpenseFlowDao extends MongoDao<ExpenseFlow>, ExpenseFlowDaoExtend {
+
+    ExpenseFlow findTopById(String id);
+
+}

+ 21 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/extend/ExpenseFlowDaoExtend.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.server.core.dao.payment.extend;
+
+import com.zhongshu.card.client.model.payment.ExpenseFlowCount;
+import com.zhongshu.card.client.model.payment.ExpenseFlowSearch;
+import com.zhongshu.card.client.model.school.BookInfoSearch;
+import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
+import com.zhongshu.card.server.core.domain.school.BookInfo;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface ExpenseFlowDaoExtend {
+    Page<ExpenseFlow> page(Pageable pageable, ExpenseFlowSearch param);
+
+    ExpenseFlowCount countPayment(ExpenseFlowSearch param);
+
+}

+ 133 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/impl/ExpenseFlowDaoImpl.java

@@ -0,0 +1,133 @@
+package com.zhongshu.card.server.core.dao.payment.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.payment.ExpenseFlowCount;
+import com.zhongshu.card.client.model.payment.ExpenseFlowSearch;
+import com.zhongshu.card.client.model.school.BookInfoSearch;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.payment.extend.ExpenseFlowDaoExtend;
+import com.zhongshu.card.server.core.dao.school.extend.BookInfoDaoExtend;
+import com.zhongshu.card.server.core.domain.org.Department;
+import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
+import com.zhongshu.card.server.core.domain.school.BookInfo;
+import com.zhongshu.card.server.core.util.CommonUtil;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class ExpenseFlowDaoImpl extends BaseImpl implements ExpenseFlowDaoExtend {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<ExpenseFlow> page(Pageable pageable, ExpenseFlowSearch param) {
+        Criteria criteria = buildCriteria(param);
+
+        if (StringUtils.isNotEmpty(param.getUserId())) {
+            criteria.and("userId").is(param.getUserId());
+        }
+
+        if (StringUtils.isNotEmpty(param.getYear())) {
+            criteria.and("year").is(param.getYear());
+        }
+
+        if (StringUtils.isNotEmpty(param.getMonth())) {
+            criteria.and("month").is(param.getMonth());
+        }
+
+        if (!CommonUtil.longIsEmpty(param.getStartTime()) && !CommonUtil.longIsEmpty(param.getEndTime())) {
+            criteria.and("createTime").gte(param.getStartTime()).and("createTime").lte(param.getEndTime());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getOrderNo())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getOrderNo() + ".*$");
+            criterias.add(Criteria.where("orderNo").is(pattern));
+        }
+        if (StringUtils.isNotEmpty(param.getPaymentNo())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getPaymentNo() + ".*$");
+            criterias.add(Criteria.where("paymentNo").is(pattern));
+        }
+
+        if (!CollectionUtils.isEmpty(criterias)) {
+            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+        }
+
+        Sort sort = buildSort(param);
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, ExpenseFlow.class);
+    }
+
+    /**
+     * 统计
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    public ExpenseFlowCount countPayment(ExpenseFlowSearch param) {
+        ExpenseFlowCount expenseFlowCount = new ExpenseFlowCount();
+        Criteria criteria = buildCriteria(param);
+
+        if (StringUtils.isNotEmpty(param.getUserId())) {
+            criteria.and("userId").is(param.getUserId());
+        }
+
+        if (StringUtils.isNotEmpty(param.getYear())) {
+            criteria.and("year").is(param.getYear());
+        }
+
+        if (StringUtils.isNotEmpty(param.getMonth())) {
+            criteria.and("month").is(param.getMonth());
+        }
+
+        if (!CommonUtil.longIsEmpty(param.getStartTime()) && !CommonUtil.longIsEmpty(param.getEndTime())) {
+            criteria.and("createTime").gte(param.getStartTime()).and("createTime").lte(param.getEndTime());
+        }
+
+        List<AggregationOperation> operations = new ArrayList<>(2);
+        AggregationOperation match = Aggregation.match(criteria);
+        operations.add(match);
+
+        AggregationOperation group = Aggregation.group("$userId").sum("$payAmount").as("count");
+        operations.add(group);
+
+        BigDecimal number = BigDecimal.ZERO;
+        Aggregation groupAggregation = Aggregation.newAggregation(operations);
+        List<Map> countObjs = mongoTemplate.aggregate(groupAggregation, ExpenseFlow.class, Map.class).getMappedResults();
+        if (countObjs.size() > 0) {
+            Map map = countObjs.get(0);
+            Object obj = map.get("count");
+            number = CommonUtil.getBigDecimalByObj(obj);
+        }
+        expenseFlowCount.setPayAmount(number);
+        return expenseFlowCount;
+    }
+
+}

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java

@@ -31,6 +31,12 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "消费类型,如:餐饮消费")
     private String payType;
 
+    @Schema(description = "年份,如:2024")
+    private String year;
+
+    @Schema(description = "月份,如06")
+    private String month;
+
     @Schema(description = "消费订单号")
     private String orderNo;
 

+ 83 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -0,0 +1,83 @@
+package com.zhongshu.card.server.core.service.payment;
+
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.zhongshu.card.client.model.payment.ExpenseFlowCount;
+import com.zhongshu.card.client.model.payment.ExpenseFlowModel;
+import com.zhongshu.card.client.model.payment.ExpenseFlowSearch;
+import com.zhongshu.card.client.model.school.BookInfoModel;
+import com.zhongshu.card.client.model.school.BookInfoSearch;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.ret.ResultMessage;
+import com.zhongshu.card.client.service.payment.ExpenseFlowService;
+import com.zhongshu.card.server.core.dao.payment.ExpenseFlowDao;
+import com.zhongshu.card.server.core.domain.payment.ExpenseFlow;
+import com.zhongshu.card.server.core.domain.school.BookInfo;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.util.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author TRX
+ * @date 2024/6/17
+ */
+@Slf4j
+@Service
+public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowService {
+    @Autowired
+    ExpenseFlowDao expenseFlowDao;
+
+    /**
+     * 查询分页数据
+     *
+     * @param param
+     * @param pageable
+     * @return
+     */
+    @Override
+    public ResultContent<Page<ExpenseFlowModel>> page(ExpenseFlowSearch param, Pageable pageable) {
+        initOidSearchParam(param);
+        Page<ExpenseFlow> page = expenseFlowDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    /**
+     * 统计用户支出总数
+     *
+     * @param param
+     * @return
+     */
+    @Override
+    public ResultContent<ExpenseFlowCount> countPayment(ExpenseFlowSearch param) {
+        param.setUserId(getCurrentUserId());
+        return ResultContent.buildSuccess(expenseFlowDao.countPayment(param));
+    }
+
+    /**
+     * 得到详情
+     *
+     * @param id
+     * @return
+     */
+    public ResultContent<ExpenseFlowModel> getDetail(String id) {
+        ExpenseFlow entity = expenseFlowDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildSuccess(String.format(ResultMessage.DATA_NOT_EXIST, id));
+        }
+        ExpenseFlowModel model = toModel(entity);
+        return ResultContent.buildSuccess(model);
+    }
+
+    public ExpenseFlowModel toModel(ExpenseFlow entity) {
+        ExpenseFlowModel model = new ExpenseFlowModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+        }
+        return model;
+    }
+
+}