Browse Source

feat: 新增对账客户查询调整:1、 供应商客户关系表增加对账金额字段,每天凌晨自动更新;
2、 客户筛选条件更新,只筛选有需要对账的数据

hejq 7 years ago
parent
commit
b9f9647580

+ 8 - 0
db/ddl.sql

@@ -5,4 +5,12 @@
 -- author: suntg
 -- author: suntg
 -- content: 内容备注xxx
 -- content: 内容备注xxx
 
 
+-- date: 2018-12-12 17:51
+-- author: hejq
+-- content: 供应商关系表增加字段,需要对账金额,次更新时间,
+-- 采用字符串是因为需要分币别统计处理
+  alter table `purc$vendors`
+  add column todo_apchek_count VARCHAR(100) default '' comment '需要对账金额',
+  add column update_time datetime comment '上一次更新时间';
+
 
 

+ 12 - 0
src/main/java/com/uas/platform/b2b/erp/model/VendorInfo.java

@@ -26,6 +26,11 @@ public class VendorInfo {
 	 */
 	 */
 	private Short apcheck;
 	private Short apcheck;
 
 
+    /**
+     * 供应商关系表id
+     */
+	private Long id;
+
 	public Long getVenduu() {
 	public Long getVenduu() {
 		return venduu;
 		return venduu;
 	}
 	}
@@ -50,4 +55,11 @@ public class VendorInfo {
 		this.apcheck = apcheck;
 		this.apcheck = apcheck;
 	}
 	}
 
 
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
 }
 }

+ 14 - 0
src/main/java/com/uas/platform/b2b/model/Vendor.java

@@ -172,6 +172,12 @@ public class Vendor implements Serializable {
 	@Column(name = "ve_erpstatus")
 	@Column(name = "ve_erpstatus")
 	private Integer erpstatus;
 	private Integer erpstatus;
 
 
+    /**
+     * 应收金额数据
+     */
+	@Column(name = "todo_apchek_count")
+    private String totalCountString;
+
     /**
     /**
      * 最近一次对账时间
      * 最近一次对账时间
      */
      */
@@ -421,6 +427,14 @@ public class Vendor implements Serializable {
         this.totalCount = totalCount;
         this.totalCount = totalCount;
     }
     }
 
 
+    public String getTotalCountString() {
+        return totalCountString;
+    }
+
+    public void setTotalCountString(String totalCountString) {
+        this.totalCountString = totalCountString;
+    }
+
     public InquiryVendorInfo covert() {
     public InquiryVendorInfo covert() {
 		InquiryVendorInfo info = new InquiryVendorInfo();
 		InquiryVendorInfo info = new InquiryVendorInfo();
 		info.setB2b_id(this.id);
 		info.setB2b_id(this.id);

+ 51 - 4
src/main/java/com/uas/platform/b2b/service/impl/PurchaseApCheckServiceImpl.java

@@ -1,8 +1,10 @@
 package com.uas.platform.b2b.service.impl;
 package com.uas.platform.b2b.service.impl;
 
 
+import com.alibaba.fastjson.JSON;
 import com.uas.platform.b2b.core.util.ContextUtils;
 import com.uas.platform.b2b.core.util.ContextUtils;
 import com.uas.platform.b2b.core.util.DateFormatUtils;
 import com.uas.platform.b2b.core.util.DateFormatUtils;
 import com.uas.platform.b2b.core.util.DateUtils;
 import com.uas.platform.b2b.core.util.DateUtils;
+import com.uas.platform.b2b.core.util.StringUtil;
 import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.core.util.ThreadUtils;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.CommonDao;
 import com.uas.platform.b2b.dao.EnterpriseDao;
 import com.uas.platform.b2b.dao.EnterpriseDao;
@@ -10,6 +12,7 @@ import com.uas.platform.b2b.dao.PurchaseApCheckDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckDoneDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckDoneDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckItemDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckItemDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckTodoDao;
 import com.uas.platform.b2b.dao.PurchaseApCheckTodoDao;
+import com.uas.platform.b2b.dao.VendorDao;
 import com.uas.platform.b2b.event.PurchaseApCheckReplyReleaseEvent;
 import com.uas.platform.b2b.event.PurchaseApCheckReplyReleaseEvent;
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.Enterprise;
 import com.uas.platform.b2b.model.OrderRedDotAll;
 import com.uas.platform.b2b.model.OrderRedDotAll;
@@ -28,6 +31,7 @@ import com.uas.platform.b2b.service.OrderRedDotService;
 import com.uas.platform.b2b.service.PurchaseApCheckService;
 import com.uas.platform.b2b.service.PurchaseApCheckService;
 import com.uas.platform.b2b.service.UserService;
 import com.uas.platform.b2b.service.UserService;
 import com.uas.platform.b2b.service.VendorService;
 import com.uas.platform.b2b.service.VendorService;
+import com.uas.platform.b2b.support.SPageUtils;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.b2b.support.SystemSession;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.model.Constant;
 import com.uas.platform.core.model.Constant;
@@ -35,12 +39,14 @@ import com.uas.platform.core.model.PageInfo;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.PageParams;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.model.Status;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
 import com.uas.platform.core.persistence.criteria.PredicateUtils;
+import com.uas.ps.core.util.StringUtils;
 import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.MultiValue;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.model.Sort;
 import com.uas.search.b2b.model.Sort;
 import com.uas.search.b2b.util.SearchConstants;
 import com.uas.search.b2b.util.SearchConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -95,6 +101,9 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
 	@Autowired
 	@Autowired
     private UserService userService;
     private UserService userService;
 
 
+	@Autowired
+    private VendorDao vendorDao;
+
     /**
     /**
      * RMB
      * RMB
      */
      */
@@ -512,15 +521,16 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
      */
      */
     @Override
     @Override
     public SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) {
     public SPage<Vendor> getCustomerInfo(PageParams params, String keyword, String checkDate, Long fromDate, Long endDate) {
-        SPage<Vendor> vendorSPage = searchCustomerInfo(params, keyword);
+        SPage<Vendor> vendorSPage = findCustomerByPage(params, keyword);
         final Long enUU = SystemSession.getUser().getEnterprise().getUu();
         final Long enUU = SystemSession.getUser().getEnterprise().getUu();
         if (!CollectionUtils.isEmpty(vendorSPage.getContent())) {
         if (!CollectionUtils.isEmpty(vendorSPage.getContent())) {
             vendorSPage.getContent().stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1)
             vendorSPage.getContent().stream().filter(customer -> null != customer.getApcheck() && customer.getApcheck() == 1)
                 .forEach(customer -> {
                 .forEach(customer -> {
                     Long customerUU = customer.getMyEnUU();
                     Long customerUU = customer.getMyEnUU();
-                    // 应收总额
-                    List<TradeCount> totalTrades = getDueTrade(enUU, customerUU);
-                    customer.setTotalCount(totalTrades);
+                    if (!StringUtils.isEmpty(customer.getTotalCountString())) {
+                        List<TradeCount> tradeCounts = JSON.parseArray(customer.getTotalCountString(), TradeCount.class);
+                        customer.setTotalCount(tradeCounts);
+                    }
                     // 本月应收
                     // 本月应收
                     List<TradeCount> thisMonthTrades = getThisMonthTrade(enUU, customerUU, checkDate, fromDate, endDate);
                     List<TradeCount> thisMonthTrades = getThisMonthTrade(enUU, customerUU, checkDate, fromDate, endDate);
                     customer.setThisMonthCount(thisMonthTrades);
                     customer.setThisMonthCount(thisMonthTrades);
@@ -529,6 +539,43 @@ public class PurchaseApCheckServiceImpl implements PurchaseApCheckService {
         return vendorSPage;
         return vendorSPage;
     }
     }
 
 
+    /**
+     * 通过分页信息查询客户信息
+     *
+     * @param params 分页参数
+     * @param keyword 搜索关键词
+     * @return 搜索结果
+     */
+    private SPage<Vendor> findCustomerByPage(PageParams params, String keyword) {
+        // 只使用前端的页码和分页大小,防止排序信息注入
+        SearchFilter filter = userService.distribute();
+        if (filter != null && filter.getDistribute() == null) {
+            return new SPage<>();
+        }
+        PageInfo pageInfo = new PageInfo(params.getPage(), params.getCount());
+        org.springframework.data.domain.Sort sort = new org.springframework.data.domain.Sort( org.springframework.data.domain.Sort.Direction.DESC, "totalCountString");
+        pageInfo.setSort(sort);
+        /*
+         * 过滤条件
+         * 1、 当前企业为供应商
+         * 2、 客户已分配
+         * 3、 开启B2B对账
+         * 4、 需要对账价格不为空
+         */
+        pageInfo.filter("vendEnUU", SystemSession.getUser().getEnterprise().getUu());
+        pageInfo.filter("apcheck", Constant.YES);
+        pageInfo.expression(PredicateUtils.ne("totalCountString", "", true));
+        if (filter != null) {
+            pageInfo.expression(PredicateUtils.in("myEnUU", filter.getDistribute(), true));
+        }
+        if (!StringUtils.isEmpty(keyword)) {
+            pageInfo.expression(PredicateUtils.like("myEnterprise.enName", keyword, true));
+        }
+        Page<Vendor> vendors = vendorDao.findAll((Root<Vendor> root, CriteriaQuery<?> query, CriteriaBuilder builder) ->
+            query.where(pageInfo.getPredicates(root, query, builder)).getRestriction(), pageInfo);
+        return SPageUtils.covertSPage(vendors);
+    }
+
     /**
     /**
      * 获取指定月份应收金额
      * 获取指定月份应收金额
      *
      *

+ 77 - 0
src/main/java/com/uas/platform/b2b/task/ApCheckTask.java

@@ -0,0 +1,77 @@
+package com.uas.platform.b2b.task;
+
+import com.alibaba.fastjson.JSON;
+import com.uas.platform.b2b.dao.CommonDao;
+import com.uas.platform.b2b.dao.CommunalLogDao;
+import com.uas.platform.b2b.erp.model.VendorInfo;
+import com.uas.platform.b2b.model.CommunalLog;
+import com.uas.platform.b2b.publicapi.model.TradeCount;
+import com.uas.platform.b2b.service.PurchaseApCheckService;
+import com.uas.platform.b2b.support.CollectionUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 对账数据维护任务
+ *
+ * @author hejq
+ * @date 2018-12-12 17:55
+ */
+@Component
+public class ApCheckTask {
+
+    /**
+     * 查询待更新处理数据的供应商客户关系
+     */
+    private static final String TODO_CUSTOMER_SQL = "select ve_id id,ve_myenuu custuu,ve_vendenuu venduu from `purc$vendors` where ve_apcheck = 1 and coalesce(update_time, '') < current_date() limit 500";
+
+    private static final String UPDATE_COUNT_SQL = "update purc$vendors set todo_apchek_count = %s, update_time = now() where ve_id = %d";
+
+    @Autowired
+    private CommonDao commonDao;
+
+    @Autowired
+    private PurchaseApCheckService apCheckService;
+
+    @Autowired
+    private CommunalLogDao communalLogDao;
+
+    /**
+     * 每天凌晨0点到2点开始执行
+     * 更新总对账和待对账的数据
+     */
+    @Scheduled(cron = "0 0/5 0,1,2 * * ? ")
+    public void updateCount() {
+        List<VendorInfo> vendorList = commonDao.query(TODO_CUSTOMER_SQL, VendorInfo.class);
+        if (!CollectionUtil.isEmpty(vendorList)) {
+            final int[] size = {0};
+            vendorList.forEach(vendorInfo -> {
+                List<TradeCount> tradeCounts = apCheckService.getDueTrade(vendorInfo.getVenduu(), vendorInfo.getCustuu());
+                if (!CollectionUtil.isEmpty(tradeCounts)) {
+                    String tradeString = JSON.toJSONString(tradeCounts);
+                    try {
+                        commonDao.getJdbcTemplate().update(String.format(UPDATE_COUNT_SQL, tradeString, vendorInfo.getId()));
+                        size[0]++;
+                    } catch (RuntimeException e) {
+                        CommunalLog log = new CommunalLog();
+                        log.setTitle("更新客户关系表对账数据--更新失败");
+                        log.setMessage("id: " + vendorInfo.getId());
+                        log.setTime(System.currentTimeMillis());
+                        communalLogDao.save(log);
+                    }
+                }
+            });
+            CommunalLog log = new CommunalLog();
+            log.setTitle("更新客户关系表对账数据");
+            log.setMessage("最小id: " + vendorList.get(0).getId() + ";数量: " + size[0]);
+            log.setTime(System.currentTimeMillis());
+            communalLogDao.save(log);
+        }
+    }
+
+}