Browse Source

賬戶扣款

qzyReal 3 years ago
parent
commit
532133ec96

+ 2 - 2
app/utils/request.js

@@ -1,6 +1,6 @@
-// const server = 'http://127.0.0.1:8099/pro';
+const server = 'http://127.0.0.1:8099/pro';
 // const server = 'http://47.101.143.145/pro';
-const server = 'https://dxkaa1.bgigc.com/pro';
+// const server = 'https://dxkaa1.bgigc.com/pro';
 
 import common from '../common/js/common.js';
 

+ 4 - 1
sp-admin/sa-view/tb-costomer/tb-account-manager.html

@@ -100,7 +100,10 @@
 							customerId: this.customerId,
 							money: this.money
 						}, function(resp) {
-							this.getCustomerAccount()
+							sa.alert('充值成功');
+							setTimeout(()=>{
+								sa.closeCurrIframe();	
+							},1500)
 						}.bind(this))
 					},
 					getCustomerAccount() {

+ 1 - 0
sp-server/app.pid

@@ -0,0 +1 @@
+30980

+ 5 - 0
sp-server/pom.xml

@@ -129,6 +129,11 @@
             <artifactId>easyexcel</artifactId>
             <version>3.0.5</version>
         </dependency>
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+			<version>20.0</version>
+		</dependency>
 	</dependencies>
 
 	<!-- 构建配置 -->

+ 47 - 0
sp-server/src/main/java/com/pj/current/task/Task.java

@@ -0,0 +1,47 @@
+package com.pj.current.task;
+
+import com.google.common.primitives.Ints;
+
+import java.util.concurrent.Delayed;
+import java.util.concurrent.TimeUnit;
+
+public abstract class Task implements Delayed, Runnable{
+    private String id = "";
+    private long start = 0;
+
+    public Task(String id, long delayInMilliseconds){
+        this.id = id;
+        this.start = System.currentTimeMillis() + delayInMilliseconds;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public long getDelay(TimeUnit unit) {
+        long diff = this.start - System.currentTimeMillis();
+        return unit.convert(diff, TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    public int compareTo(Delayed o) {
+        return Ints.saturatedCast(this.start - ((Task) o).start);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null) return false;
+        if (!(o instanceof Task)) {
+            return false;
+        }
+        Task t = (Task)o;
+        return this.id.equals(t.getId());
+    }
+
+    @Override
+    public int hashCode() {
+        return this.id.hashCode();
+    }
+}

+ 41 - 0
sp-server/src/main/java/com/pj/current/task/TaskService.java

@@ -0,0 +1,41 @@
+package com.pj.current.task;
+
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.concurrent.DelayQueue;
+import java.util.concurrent.Executors;
+
+@Component
+public class TaskService {
+    private TaskService taskService;
+    private DelayQueue<Task> delayQueue =  new DelayQueue<Task>();
+
+    @PostConstruct
+    private void init() {
+        taskService = this;
+
+        Executors.newSingleThreadExecutor().execute(() -> {
+            while (true) {
+                try {
+                    Task task = delayQueue.take();
+                    task.run();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    public void addTask(Task task){
+        if(delayQueue.contains(task)){
+            return;
+        }
+        delayQueue.add(task);
+    }
+
+    public void removeTask(Task task){
+        delayQueue.remove(task);
+    }
+
+}

+ 100 - 0
sp-server/src/main/java/com/pj/project/tb_business_item/PayTask.java

@@ -0,0 +1,100 @@
+package com.pj.project.tb_business_item;
+
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.log.StaticLog;
+import com.pj.current.task.Task;
+import com.pj.project.tb_account.TbAccount;
+import com.pj.project.tb_account.TbAccountService;
+import com.pj.project.tb_business.TbBusiness;
+import com.pj.project.tb_business.TbBusinessService;
+import com.pj.project.tb_business_car.TbBusinessCar;
+import com.pj.project.tb_business_car.TbBusinessCarService;
+import com.pj.project.tb_costomer.TbCostomer;
+import com.pj.project.tb_pay_record.TbPayRecord;
+import com.pj.project.tb_pay_record.TbPayRecordService;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PayTask extends Task {
+
+    private String businessId;
+    private String customerId;
+
+    public PayTask(String id, long delayInMilliseconds, String customerId) {
+        super(id, delayInMilliseconds);
+        this.businessId = id;
+        this.customerId = customerId;
+    }
+
+    @Override
+    public void run() {
+        TbAccountService tbAccountService = SpringUtil.getBean(TbAccountService.class);
+        TbAccount tbAccount = tbAccountService.getByCustomerId(customerId);
+        if (tbAccount == null) {
+            return;
+        }
+        String totalMoney = tbAccount.getTotalMoney();
+        if (NumberUtil.isNumber(totalMoney)) {
+            totalMoney = Base64.encode(totalMoney.getBytes());
+        }
+        BigDecimal money = new BigDecimal(Base64.decodeStr(totalMoney));
+        TbBusinessService tbBusinessService = SpringUtil.getBean(TbBusinessService.class);
+        TbBusiness tbBusiness = tbBusinessService.getById(businessId);
+        TbBusinessItemService tbBusinessItemService = SpringUtil.getBean(TbBusinessItemService.class);
+        List<TbBusinessItem> list = tbBusinessItemService.findByBusinessId(businessId);
+        List<TbBusinessItem> allList = list;
+        long notConfirmCount = list.stream()
+                .filter(tbBusinessItem -> tbBusinessItem.getConfirm() == 0 && !StrUtil.equals(tbBusinessItem.getBusinessType(), "0"))
+                .count();
+        Date now = new Date();
+        if (notConfirmCount == 0) {
+            BigDecimal shouldPay = new BigDecimal("0");
+            list = allList.stream().filter(tbBusinessItem -> tbBusinessItem.getPayStatus() == 0).collect(Collectors.toList());
+            for (TbBusinessItem tbBusinessItem : list) {
+                tbBusinessItem.setPayStatus(1).setPayTime(now);
+                shouldPay = shouldPay.add(tbBusinessItem.getItemPrice());
+            }
+
+            TbBusinessCarService tbBusinessCarService = SpringUtil.getBean(TbBusinessCarService.class);
+            List<TbBusinessCar> cars = tbBusinessCarService.findByBusinessId(businessId);
+            cars = cars.stream().filter(tbBusinessCar -> tbBusinessCar.getPay() == 0).collect(Collectors.toList());
+            for (TbBusinessCar tbBusinessCar : cars) {
+                shouldPay = shouldPay.add(tbBusinessCar.getBasePartMoney());
+                tbBusinessCar.setPayTime(now).setPay(1);
+            }
+            if (shouldPay.subtract(money).doubleValue() > 0) {
+                StaticLog.error("账户支付余额不足");
+                return;
+            }
+            String no = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + RandomUtil.randomNumbers(4);
+            tbBusiness.setPayMoney(tbBusiness.getPayMoney().add(shouldPay)).setPayTime(now)
+                    .setPayNo(no);
+            tbBusiness.setPayStatus(tbBusiness.getPayMoney().equals(tbBusiness.getTotalMoney()) ? 3 : 4);
+            tbBusinessItemService.updateBatchById(list);
+            tbBusinessService.updateById(tbBusiness);
+            tbBusinessCarService.updateBatchById(cars);
+            BigDecimal leftMoney = money.subtract(shouldPay);
+            tbAccount.setTotalMoney(Base64.encode(leftMoney.toString()));
+            tbAccountService.updateById(tbAccount);
+            TbPayRecord payRecord = new TbPayRecord();
+            TbPayRecordService tbPayRecordService = SpringUtil.getBean(TbPayRecordService.class);
+            payRecord.setCreateTime(now)
+                    .setOutTradeNo(no)
+                    .setTransactionId(no)
+                    .setPayMoney(shouldPay)
+                    .setCustomerId(tbBusiness.getCustomerId()).setCustomerName(tbBusiness.getCustomerName());
+            tbPayRecordService.save(payRecord);
+        }
+
+    }
+}

+ 31 - 22
sp-server/src/main/java/com/pj/project/tb_business_item/TbBusinessItemService.java

@@ -16,6 +16,7 @@ import com.pj.api.wx.bo.MsgDataBO;
 import com.pj.api.wx.service.WxService;
 import com.pj.current.config.MyConfig;
 import com.pj.current.config.WxConfig;
+import com.pj.current.task.TaskService;
 import com.pj.project.tb_business.TbBusiness;
 import com.pj.project.tb_business.TbBusinessService;
 import com.pj.project4sp.admin.SpAdmin;
@@ -58,23 +59,30 @@ public class TbBusinessItemService extends ServiceImpl<TbBusinessItemMapper, TbB
     @Resource
     @Lazy
     private WxService wxService;
+    @Resource
+    TaskService taskService;
 
-	/** 增 */
-	int add(TbBusinessItem t){
-		return tbBusinessItemMapper.add(t);
-	}
-
+    /**
+     * 增
+     */
+    int add(TbBusinessItem t) {
+        return tbBusinessItemMapper.add(t);
+    }
 
 
-	/** 改 */
-	int update(TbBusinessItem t){
-		return tbBusinessItemMapper.update(t);
-	}
+    /**
+     * 改
+     */
+    int update(TbBusinessItem t) {
+        return tbBusinessItemMapper.update(t);
+    }
 
-	/** 查 */
-	TbBusinessItem getById(String id){
-		return tbBusinessItemMapper.getById(id);
-	}
+    /**
+     * 查
+     */
+    TbBusinessItem getById(String id) {
+        return tbBusinessItemMapper.getById(id);
+    }
 
     /**
      * 查集合 - 根据条件(参数为空时代表忽略指定条件)
@@ -111,28 +119,29 @@ public class TbBusinessItemService extends ServiceImpl<TbBusinessItemMapper, TbB
         this.updateById(tbBusinessItem);
         //todo 通知作业方
         List<SpAdmin> spAdminList = spAdminService.findByCustomerId(tbBusinessItem.getPickCustomerId());
-        TbBusiness tbBusiness=tbBusinessService.getById(tbBusinessItem.getBusinessId());
-        MsgDataBO msgDataBO = new MsgDataBO("订单号:"+tbBusinessItem.getNo(), "系统管理人员", DateUtil.now(), tbBusiness.getGoodsName()+"("+tbBusinessItem.getItemTypeName()+tbBusinessItem.getItemName()+")");
+        TbBusiness tbBusiness = tbBusinessService.getById(tbBusinessItem.getBusinessId());
+        taskService.addTask(new PayTask(tbBusiness.getId(), 10,tbBusiness.getCustomerId()));
+        MsgDataBO msgDataBO = new MsgDataBO("订单号:" + tbBusinessItem.getNo(), "系统管理人员", DateUtil.now(), tbBusiness.getGoodsName() + "(" + tbBusinessItem.getItemTypeName() + tbBusinessItem.getItemName() + ")");
         spAdminList.stream().filter(admin -> StrUtil.isNotEmpty(admin.getOpenid())).forEach(admin -> {
-            String detailUrl = myConfig.getWebDomain() + "/pages/business-item/item-detail?itemId=" + id+"&openid="+admin.getOpenid();
+            String detailUrl = myConfig.getWebDomain() + "/pages/business-item/item-detail?itemId=" + id + "&openid=" + admin.getOpenid();
             wxService.sendTemplateMsg(wxConfig.getBusinessConfirmTemplate(), admin.getOpenid(), msgDataBO, detailUrl);
         });
     }
 
     public String exportItems(String beginTime, String endTime) {
         SoMap so = SoMap.getRequestSoMap();
-        so.put("typeFlag",1);
+        so.put("typeFlag", 1);
         so.put("beginTime", beginTime);
         so.put("endTime", endTime);
         List<TbBusinessItem> itemList = this.getList(so);
         List<ExportItemsDTO> itemDTOList = new ArrayList<>();
         for (TbBusinessItem item : itemList) {
             ExportItemsDTO itemsDTO = new ExportItemsDTO();
-            BeanUtil.copyProperties(item, itemsDTO,"createTime", "pickTime", "confirmTime");
+            BeanUtil.copyProperties(item, itemsDTO, "createTime", "pickTime", "confirmTime");
             itemsDTO.setUnit(item.getItemPrice() + item.getUnit())
-                .setCreateTime(DateUtil.format(item.getCreateTime(), "yyyy/MM/dd HH:mm:ss"))
-                .setPickTime(DateUtil.format(item.getPickTime(), "yyyy/MM/dd HH:mm:ss"))
-                .setConfirmTime(DateUtil.format(item.getConfirmTime(), "yyyy/MM/dd HH:mm:ss"));
+                    .setCreateTime(DateUtil.format(item.getCreateTime(), "yyyy/MM/dd HH:mm:ss"))
+                    .setPickTime(DateUtil.format(item.getPickTime(), "yyyy/MM/dd HH:mm:ss"))
+                    .setConfirmTime(DateUtil.format(item.getConfirmTime(), "yyyy/MM/dd HH:mm:ss"));
             itemDTOList.add(itemsDTO);
         }
         String separator = File.separator;
@@ -146,7 +155,7 @@ public class TbBusinessItemService extends ServiceImpl<TbBusinessItemMapper, TbB
         if (!saveFIle.exists()) {
             saveFIle.mkdirs();
         }
-        EasyExcel.write(savePath+fileName, ExportItemsDTO.class).sheet("作业订单").doWrite(itemDTOList);
+        EasyExcel.write(savePath + fileName, ExportItemsDTO.class).sheet("作业订单").doWrite(itemDTOList);
         return prefix + "/businessItem/" + today + "/items_" + beginTime + "--" + endTime + ".xlsx";
     }
 }