瀏覽代碼

稳定版本代码

alibct 2 年之前
父節點
當前提交
62ccdd3c7e

+ 9 - 0
src/main/java/com/pavis/ctr/audit/common/utils/CtrUtils.java

@@ -0,0 +1,9 @@
+package com.pavis.ctr.audit.common.utils;
+
+/**
+ * 项目通用工具类
+ * @author semi
+ * @create 2023-05-05 16:16
+ */
+public class CtrUtils {
+}

+ 68 - 0
src/main/java/com/pavis/ctr/audit/project/controller/InitAuditTripController.java

@@ -0,0 +1,68 @@
+package com.pavis.ctr.audit.project.controller;
+
+import com.pavis.ctr.audit.project.domain.OcrTrip;
+import com.pavis.ctr.audit.project.service.IAuditTripMainService;
+import com.pavis.ctr.audit.project.service.IOcrTripService;
+import com.pavis.ctr.audit.web.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author semi
+ * @create 2023-05-06 09:36
+ */
+@Api("初始化审核小票")
+@RestController
+public class InitAuditTripController {
+
+    @Autowired
+    private IOcrTripService ocrTripService;
+
+    @Autowired
+    private IAuditTripMainService auditTripMainService;
+
+    @ApiOperation("初始化审核小票数据")
+    @GetMapping("/init/auditTrip")
+    public AjaxResult initAuditTrip() {
+        // 获取需要初始化的小票数据
+        List<OcrTrip> ocrTrips = ocrTripService.getAuditTrip();
+        if (ocrTrips != null && ocrTrips.size() > 0) {
+            int auditTripSize = auditTripMainService.adaptAuditTrip(ocrTrips);
+            return AjaxResult.success(String.format("初始化成功,待审核小票数量为:%d", auditTripSize));
+        } else {
+            return AjaxResult.success("没有需要初始化的审核数据!");
+        }
+    }
+
+    @ApiOperation("根据datedir初始化审核小票数据")
+    @GetMapping("/init/auditTrip/{datedir}")
+    public AjaxResult initAuditTripByDateDir(@PathVariable("datedir") String dateDir) {
+        // 获取需要初始化的小票数据
+        List<OcrTrip> ocrTrips = ocrTripService.getAuditTripByDateDir(dateDir);
+        if (ocrTrips != null && ocrTrips.size() > 0) {
+            int auditTripSize = auditTripMainService.adaptAuditTrip(ocrTrips);
+            return AjaxResult.success(String.format("初始化成功,待审核小票数量为:%d", auditTripSize));
+        } else {
+            return AjaxResult.success("没有需要初始化的审核数据!");
+        }
+    }
+
+    @ApiOperation("更新某个datedir的数据")
+    @GetMapping("/update/auditTrip/{datedir}")
+    public AjaxResult updateAuditTripByDateDir(@PathVariable("datedir") String dateDir) {
+        // 获取需要初始化的小票数据
+        List<OcrTrip> ocrTrips = ocrTripService.updateAuditTripByDateDir(dateDir);
+        if (ocrTrips != null && ocrTrips.size() > 0) {
+            int auditTripSize = auditTripMainService.adaptAuditTrip(ocrTrips);
+            return AjaxResult.success(String.format("更新成功,更新的待审核小票数量为:%d", auditTripSize));
+        } else {
+            return AjaxResult.success("没有需要更新的审核数据!");
+        }
+    }
+}

+ 254 - 0
src/main/java/com/pavis/ctr/audit/project/domain/OcrTrip.java

@@ -0,0 +1,254 @@
+package com.pavis.ctr.audit.project.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.pavis.ctr.audit.common.constant.Constants;
+import com.pavis.ctr.audit.common.utils.DateUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+
+/**
+ * @author semi
+ * @create 2023-05-05 15:20
+ */
+public class OcrTrip {
+
+    @TableId
+    private String uploadId;
+
+    private String shopName;
+
+    private String o2oShopName;
+
+    private String branchShopName;
+
+    private String purchaseDate;
+
+    private String totalSpend;
+
+    private String basket;
+
+    private String tripNumber;
+
+    private String address;
+
+    private String phone;
+
+    private String pay;
+
+    private String specPayValue;
+
+    private String offer;
+
+    private String member;
+
+    private String globalProb;
+
+    private String dateDir;
+
+    private String fileName;
+
+    private String sTripPhotoId;
+
+    private String photoNo;
+
+    private String userId;
+
+    @TableField(exist = false)
+    private String errReason;
+
+    public String getUploadId() {
+        return uploadId;
+    }
+
+    public void setUploadId(String uploadId) {
+        this.uploadId = uploadId;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public String getO2oShopName() {
+        return o2oShopName;
+    }
+
+    public void setO2oShopName(String o2oShopName) {
+        this.o2oShopName = o2oShopName;
+    }
+
+    public String getBranchShopName() {
+        return branchShopName;
+    }
+
+    public void setBranchShopName(String branchShopName) {
+        this.branchShopName = branchShopName;
+    }
+
+    public String getPurchaseDate() {
+        return purchaseDate;
+    }
+
+    public void setPurchaseDate(String purchaseDate) {
+        this.purchaseDate = purchaseDate;
+    }
+
+    public String getTotalSpend() {
+        return totalSpend;
+    }
+
+    public void setTotalSpend(String totalSpend) {
+        this.totalSpend = totalSpend;
+    }
+
+    public String getBasket() {
+        return basket;
+    }
+
+    public void setBasket(String basket) {
+        this.basket = basket;
+    }
+
+    public String getTripNumber() {
+        return tripNumber;
+    }
+
+    public void setTripNumber(String tripNumber) {
+        this.tripNumber = tripNumber;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getPay() {
+        return pay;
+    }
+
+    public void setPay(String pay) {
+        this.pay = pay;
+    }
+
+    public String getSpecPayValue() {
+        return specPayValue;
+    }
+
+    public void setSpecPayValue(String specPayValue) {
+        this.specPayValue = specPayValue;
+    }
+
+    public String getOffer() {
+        return offer;
+    }
+
+    public void setOffer(String offer) {
+        this.offer = offer;
+    }
+
+    public String getMember() {
+        return member;
+    }
+
+    public void setMember(String member) {
+        this.member = member;
+    }
+
+    public String getGlobalProb() {
+        return globalProb;
+    }
+
+    public void setGlobalProb(String globalProb) {
+        this.globalProb = globalProb;
+    }
+
+    public String getDateDir() {
+        return dateDir;
+    }
+
+    public void setDateDir(String dateDir) {
+        this.dateDir = dateDir;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getsTripPhotoId() {
+        return sTripPhotoId;
+    }
+
+    public void setsTripPhotoId(String sTripPhotoId) {
+        this.sTripPhotoId = sTripPhotoId;
+    }
+
+    public String getPhotoNo() {
+        return photoNo;
+    }
+
+    public void setPhotoNo(String photoNo) {
+        this.photoNo = photoNo;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public void setErrReason(String errReason) {
+        this.errReason = errReason;
+    }
+
+    public String getErrReason() {
+        // 缺少商品明细,优先级1
+        if (StringUtils.isNotBlank(this.errReason)) {
+            return this.errReason;
+        }
+        // 多渠道上传,优先级2
+        if (StringUtils.equals(Constants.MULTI_UPLOAD_MARK, this.globalProb)) {
+            return Constants.MULTI_UPLOAD;
+        }
+        // 购买日期超过28天
+        if (StringUtils.isNotBlank(this.purchaseDate)) {
+            Date now = new Date();
+            Date purDate = DateUtils.parseDate(this.purchaseDate);
+            if (DateUtils.differentDaysByMillisecond(now, purDate) > Constants.INVALID_DAYS) {
+                return Constants.INVALID_PURCHASE_DATE;
+            }
+        }
+        if (StringUtils.isBlank(this.purchaseDate) && StringUtils.isBlank(this.totalSpend)) {
+            // 购买日期和总金额都为空
+            return Constants.LACK_ALL;
+        } else if (StringUtils.isBlank(this.totalSpend)) {
+            // 总金额为空,优先级3
+            return Constants.LACK_TOTAL_SPEND;
+        } else if (StringUtils.isBlank(this.purchaseDate)) {
+            // 购买日期为空,优先级4
+            return Constants.LACK_PURCHASE_DATE;
+        }
+        return this.errReason;
+    }
+}

+ 127 - 0
src/main/java/com/pavis/ctr/audit/project/domain/OcrTripDet.java

@@ -0,0 +1,127 @@
+package com.pavis.ctr.audit.project.domain;
+
+/**
+ * @author semi
+ * @create 2023-05-05 17:14
+ */
+public class OcrTripDet {
+    private Integer id;
+    private String uploadId;
+    private String goodsCode;
+    private String goodsName;
+    private String amount;
+    private String unitPrice;
+    private String subTotal;
+    private String subOffer;
+    private String prob;
+    private String dateDir;
+
+    private String fileName;
+
+    private String sTripPhotoId;
+    private String photoNo;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getUploadId() {
+        return uploadId;
+    }
+
+    public void setUploadId(String uploadId) {
+        this.uploadId = uploadId;
+    }
+
+    public String getGoodsCode() {
+        return goodsCode;
+    }
+
+    public void setGoodsCode(String goodsCode) {
+        this.goodsCode = goodsCode;
+    }
+
+    public String getGoodsName() {
+        return goodsName;
+    }
+
+    public void setGoodsName(String goodsName) {
+        this.goodsName = goodsName;
+    }
+
+    public String getAmount() {
+        return amount;
+    }
+
+    public void setAmount(String amount) {
+        this.amount = amount;
+    }
+
+    public String getUnitPrice() {
+        return unitPrice;
+    }
+
+    public void setUnitPrice(String unitPrice) {
+        this.unitPrice = unitPrice;
+    }
+
+    public String getSubTotal() {
+        return subTotal;
+    }
+
+    public void setSubTotal(String subTotal) {
+        this.subTotal = subTotal;
+    }
+
+    public String getSubOffer() {
+        return subOffer;
+    }
+
+    public void setSubOffer(String subOffer) {
+        this.subOffer = subOffer;
+    }
+
+    public String getProb() {
+        return prob;
+    }
+
+    public void setProb(String prob) {
+        this.prob = prob;
+    }
+
+    public String getDateDir() {
+        return dateDir;
+    }
+
+    public void setDateDir(String dateDir) {
+        this.dateDir = dateDir;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getsTripPhotoId() {
+        return sTripPhotoId;
+    }
+
+    public void setsTripPhotoId(String sTripPhotoId) {
+        this.sTripPhotoId = sTripPhotoId;
+    }
+
+    public String getPhotoNo() {
+        return photoNo;
+    }
+
+    public void setPhotoNo(String photoNo) {
+        this.photoNo = photoNo;
+    }
+}

+ 37 - 0
src/main/java/com/pavis/ctr/audit/project/domain/UpTrip.java

@@ -0,0 +1,37 @@
+package com.pavis.ctr.audit.project.domain;
+
+/**
+ * @author semi
+ * @create 2023-05-05 16:51
+ */
+public class UpTrip {
+    private String tripImg;
+
+    private String sTripPhotoId;
+
+    private Integer photoNo;
+
+    public String getTripImg() {
+        return tripImg;
+    }
+
+    public void setTripImg(String tripImg) {
+        this.tripImg = tripImg;
+    }
+
+    public String getsTripPhotoId() {
+        return sTripPhotoId;
+    }
+
+    public void setsTripPhotoId(String sTripPhotoId) {
+        this.sTripPhotoId = sTripPhotoId;
+    }
+
+    public Integer getPhotoNo() {
+        return photoNo;
+    }
+
+    public void setPhotoNo(Integer photoNo) {
+        this.photoNo = photoNo;
+    }
+}

+ 11 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/OcrTripDetMapper.java

@@ -0,0 +1,11 @@
+package com.pavis.ctr.audit.project.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ctr.audit.project.domain.OcrTripDet;
+
+/**
+ * @author semi
+ * @create 2023-05-05 17:17
+ */
+public interface OcrTripDetMapper extends BaseMapper<OcrTripDet> {
+}

+ 11 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/OcrTripMapper.java

@@ -0,0 +1,11 @@
+package com.pavis.ctr.audit.project.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ctr.audit.project.domain.OcrTrip;
+
+/**
+ * @author semi
+ * @create 2023-05-05 15:25
+ */
+public interface OcrTripMapper extends BaseMapper<OcrTrip> {
+}

+ 11 - 0
src/main/java/com/pavis/ctr/audit/project/mapper/UpTripMapper.java

@@ -0,0 +1,11 @@
+package com.pavis.ctr.audit.project.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pavis.ctr.audit.project.domain.UpTrip;
+
+/**
+ * @author semi
+ * @create 2023-05-05 16:52
+ */
+public interface UpTripMapper extends BaseMapper<UpTrip> {
+}

+ 11 - 0
src/main/java/com/pavis/ctr/audit/project/service/IOcrTripDetService.java

@@ -0,0 +1,11 @@
+package com.pavis.ctr.audit.project.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.pavis.ctr.audit.project.domain.OcrTripDet;
+
+/**
+ * @author semi
+ * @create 2023-05-05 17:18
+ */
+public interface IOcrTripDetService extends IService<OcrTripDet> {
+}

+ 37 - 0
src/main/java/com/pavis/ctr/audit/project/service/IOcrTripService.java

@@ -0,0 +1,37 @@
+package com.pavis.ctr.audit.project.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.pavis.ctr.audit.project.domain.OcrTrip;
+
+import java.util.List;
+
+/**
+ * @author semi
+ * @create 2023-05-05 15:26
+ */
+public interface IOcrTripService extends IService<OcrTrip> {
+
+    /**
+     * 从数据源ocr_trip获取满足审核条件的小票数据
+     *
+     * @return 满足审核要求的小票数据
+     */
+    List<OcrTrip> getAuditTrip();
+
+
+    /**
+     * 根据datedir获取小票数据
+     *
+     * @param dateDir datedir日期
+     * @return 需要审核的小票数据
+     */
+    List<OcrTrip> getAuditTripByDateDir(String dateDir);
+
+    /**
+     * 更新某一个datedir对应的待审核数据
+     *
+     * @param dateDir 需要更新的datedir
+     * @return 需要同步到待审核库的数据
+     */
+    List<OcrTrip> updateAuditTripByDateDir(String dateDir);
+}

+ 11 - 0
src/main/java/com/pavis/ctr/audit/project/service/IUpTripService.java

@@ -0,0 +1,11 @@
+package com.pavis.ctr.audit.project.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.pavis.ctr.audit.project.domain.UpTrip;
+
+/**
+ * @author semi
+ * @create 2023-05-05 16:53
+ */
+public interface IUpTripService extends IService<UpTrip> {
+}

+ 15 - 0
src/main/java/com/pavis/ctr/audit/project/service/impl/OcrTripDetServiceImpl.java

@@ -0,0 +1,15 @@
+package com.pavis.ctr.audit.project.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.ctr.audit.project.domain.OcrTripDet;
+import com.pavis.ctr.audit.project.mapper.OcrTripDetMapper;
+import com.pavis.ctr.audit.project.service.IOcrTripDetService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author semi
+ * @create 2023-05-05 17:18
+ */
+@Service
+public class OcrTripDetServiceImpl extends ServiceImpl<OcrTripDetMapper, OcrTripDet> implements IOcrTripDetService {
+}

+ 107 - 0
src/main/java/com/pavis/ctr/audit/project/service/impl/OcrTripServiceImpl.java

@@ -0,0 +1,107 @@
+package com.pavis.ctr.audit.project.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.ctr.audit.common.constant.Constants;
+import com.pavis.ctr.audit.project.domain.AuditTripMain;
+import com.pavis.ctr.audit.project.domain.OcrTrip;
+import com.pavis.ctr.audit.project.domain.OcrTripDet;
+import com.pavis.ctr.audit.project.mapper.OcrTripMapper;
+import com.pavis.ctr.audit.project.service.IAuditTripMainService;
+import com.pavis.ctr.audit.project.service.IOcrTripDetService;
+import com.pavis.ctr.audit.project.service.IOcrTripService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author semi
+ * @create 2023-05-05 15:26
+ */
+@Service
+public class OcrTripServiceImpl extends ServiceImpl<OcrTripMapper, OcrTrip> implements IOcrTripService {
+
+    @Autowired
+    private IOcrTripDetService ocrTripDetService;
+
+    @Autowired
+    private IAuditTripMainService auditTripMainService;
+
+    @Override
+    public List<OcrTrip> getAuditTrip() {
+        return getAuditTripByDateDir(null);
+    }
+
+    @Override
+    public List<OcrTrip> getAuditTripByDateDir(String dateDir) {
+        List<OcrTrip> ocrTrips = null;
+        if (StringUtils.isNotBlank(dateDir)) {
+            QueryWrapper<OcrTrip> queryWrapper = new QueryWrapper<>();
+            queryWrapper.ge("date_dir", dateDir);
+            ocrTrips = baseMapper.selectList(queryWrapper);
+        } else {
+            // 1. 获取最后一次保存的小票数据的dateDir
+            String lastDateDir = auditTripMainService.getLastDateDir();
+            // 2. 判断是否是第一次保存
+            if (StringUtils.isNotBlank(lastDateDir)) {
+                QueryWrapper<OcrTrip> queryWrapper = new QueryWrapper<>();
+                queryWrapper.ge("date_dir", lastDateDir);
+                ocrTrips = baseMapper.selectList(queryWrapper);
+            } else {
+                // 第一次保存,需要获取所有待审核小票数据并分类存储
+                ocrTrips = baseMapper.selectList(null);
+            }
+        }
+        return getAuditOcrTrips(ocrTrips);
+    }
+
+
+    /**
+     * 筛选满足条件的待审核小票信息
+     * 缺少购买日期、缺少购买总金额、缺少商品明细、购买日期超过28天、OCR判断为多渠道上传
+     * @param ocrTrips 需要筛选的小票信息
+     * @return 筛选后的小票信息
+     */
+    public List<OcrTrip> getAuditOcrTrips(List<OcrTrip> ocrTrips) {
+        // 返回满足要求的待审核小票数据
+        if (ocrTrips != null && ocrTrips.size() > 0) {
+            // 判断小票明细是否为空
+            for (OcrTrip ocrTrip : ocrTrips) {
+                List<OcrTripDet> ocrTripDets = ocrTripDetService.query().eq("upload_id", ocrTrip.getUploadId()).list();
+                if (CollectionUtils.isEmpty(ocrTripDets)) {
+                    ocrTrip.setErrReason(Constants.LACK_TRIP_DET);
+                }
+            }
+            return ocrTrips.stream().filter(ocrTrip -> StringUtils.isNotBlank(ocrTrip.getErrReason())).collect(Collectors.toList());
+        }
+        return null;
+    }
+
+    @Override
+    public List<OcrTrip> updateAuditTripByDateDir(String dateDir) {
+        // 1. 获取ocr_trip中对应date_dir那天满足待审核条件的upload_id集合
+        List<OcrTrip> ocrTrips = query().eq("date_dir", dateDir).list();
+        List<String> uploadIds = getAuditOcrTrips(ocrTrips)
+                .stream()
+                .map(OcrTrip::getUploadId)
+                .collect(Collectors.toList());
+        // 2. 获取audit_trip_main中对应date_dir的upload_id集合
+        List<String> auditUploadIds = auditTripMainService.query().eq("date_dir", dateDir).list()
+                .stream()
+                .map(AuditTripMain::getUploadId)
+                .collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(uploadIds) && CollectionUtils.isNotEmpty(auditUploadIds)) {
+            // 计算两个集合的差集
+            Collection<String> subtract = CollectionUtils.subtract(uploadIds, auditUploadIds);
+            if (CollectionUtils.isNotEmpty(subtract)) {
+                return query().in("upload_id", subtract).list();
+            }
+        }
+        return null;
+    }
+}

+ 15 - 0
src/main/java/com/pavis/ctr/audit/project/service/impl/UpTripServiceImpl.java

@@ -0,0 +1,15 @@
+package com.pavis.ctr.audit.project.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.pavis.ctr.audit.project.domain.UpTrip;
+import com.pavis.ctr.audit.project.mapper.UpTripMapper;
+import com.pavis.ctr.audit.project.service.IUpTripService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author semi
+ * @create 2023-05-05 16:53
+ */
+@Service
+public class UpTripServiceImpl extends ServiceImpl<UpTripMapper, UpTrip> implements IUpTripService {
+}