Your Name лет назад: 3
Родитель
Сommit
bdf52e1a16

+ 75 - 45
java110-bean/src/main/java/com/java110/po/reserveGoodsOrder/ReserveGoodsOrderPo.java

@@ -17,6 +17,7 @@ package com.java110.po.reserveGoodsOrder;
 
 import java.io.Serializable;
 import java.util.Date;
+
 /**
  * 类表述: Po 数据模型实体对象 基本保持与数据库模型一直 用于 增加修改删除 等时的数据载体
  * add by 吴学文 at 2022-12-06 10:58:18 mail: 928255095@qq.com
@@ -28,111 +29,140 @@ import java.util.Date;
 public class ReserveGoodsOrderPo implements Serializable {
 
     private String orderId;
-private String goodsId;
-private String receivableAmount;
-private String payWay;
-private String remark;
-private String statusCd = "0";
-private String receivedAmount;
-private String type;
-private String personName;
-private String extOrderId;
-private String appointmentTime;
-private String personId;
-private String state;
-private String personTel;
-private String communityId;
-public String getOrderId() {
+    private String goodsId;
+    private String receivableAmount;
+    private String payWay;
+    private String remark;
+    private String statusCd = "0";
+    private String receivedAmount;
+    private String type;
+    private String personName;
+    private String extOrderId;
+    private String appointmentTime;
+    private String personId;
+    private String state;
+    private String personTel;
+    private String communityId;
+
+    public String getOrderId() {
         return orderId;
     }
-public void setOrderId(String orderId) {
+
+    public void setOrderId(String orderId) {
         this.orderId = orderId;
     }
-public String getGoodsId() {
+
+    public String getGoodsId() {
         return goodsId;
     }
-public void setGoodsId(String goodsId) {
+
+    public void setGoodsId(String goodsId) {
         this.goodsId = goodsId;
     }
-public String getReceivableAmount() {
+
+    public String getReceivableAmount() {
         return receivableAmount;
     }
-public void setReceivableAmount(String receivableAmount) {
+
+    public void setReceivableAmount(String receivableAmount) {
         this.receivableAmount = receivableAmount;
     }
-public String getPayWay() {
+
+    public String getPayWay() {
         return payWay;
     }
-public void setPayWay(String payWay) {
+
+    public void setPayWay(String payWay) {
         this.payWay = payWay;
     }
-public String getRemark() {
+
+    public String getRemark() {
         return remark;
     }
-public void setRemark(String remark) {
+
+    public void setRemark(String remark) {
         this.remark = remark;
     }
-public String getStatusCd() {
+
+    public String getStatusCd() {
         return statusCd;
     }
-public void setStatusCd(String statusCd) {
+
+    public void setStatusCd(String statusCd) {
         this.statusCd = statusCd;
     }
-public String getReceivedAmount() {
+
+    public String getReceivedAmount() {
         return receivedAmount;
     }
-public void setReceivedAmount(String receivedAmount) {
+
+    public void setReceivedAmount(String receivedAmount) {
         this.receivedAmount = receivedAmount;
     }
-public String getType() {
+
+    public String getType() {
         return type;
     }
-public void setType(String type) {
+
+    public void setType(String type) {
         this.type = type;
     }
-public String getPersonName() {
+
+    public String getPersonName() {
         return personName;
     }
-public void setPersonName(String personName) {
+
+    public void setPersonName(String personName) {
         this.personName = personName;
     }
-public String getExtOrderId() {
+
+    public String getExtOrderId() {
         return extOrderId;
     }
-public void setExtOrderId(String extOrderId) {
+
+    public void setExtOrderId(String extOrderId) {
         this.extOrderId = extOrderId;
     }
-public String getAppointmentTime() {
+
+    public String getAppointmentTime() {
         return appointmentTime;
     }
-public void setAppointmentTime(String appointmentTime) {
+
+    public void setAppointmentTime(String appointmentTime) {
         this.appointmentTime = appointmentTime;
     }
-public String getPersonId() {
+
+    public String getPersonId() {
         return personId;
     }
-public void setPersonId(String personId) {
+
+    public void setPersonId(String personId) {
         this.personId = personId;
     }
-public String getState() {
+
+    public String getState() {
         return state;
     }
-public void setState(String state) {
+
+    public void setState(String state) {
         this.state = state;
     }
-public String getPersonTel() {
+
+    public String getPersonTel() {
         return personTel;
     }
-public void setPersonTel(String personTel) {
+
+    public void setPersonTel(String personTel) {
         this.personTel = personTel;
     }
-public String getCommunityId() {
+
+    public String getCommunityId() {
         return communityId;
     }
-public void setCommunityId(String communityId) {
+
+    public void setCommunityId(String communityId) {
         this.communityId = communityId;
     }
 
 
-
 }

+ 261 - 0
service-acct/src/main/java/com/java110/acct/payment/business/reserve/ReserveGoodsPaymentBusiness.java

@@ -0,0 +1,261 @@
+package com.java110.acct.payment.business.reserve;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.acct.payment.IPaymentBusiness;
+import com.java110.core.context.ICmdDataFlowContext;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.doc.annotation.*;
+import com.java110.dto.communitySpace.CommunitySpaceDto;
+import com.java110.dto.communitySpacePerson.CommunitySpacePersonDto;
+import com.java110.dto.communitySpacePersonTime.CommunitySpacePersonTimeDto;
+import com.java110.dto.payment.PaymentOrderDto;
+import com.java110.dto.reserveGoods.ReserveGoodsDto;
+import com.java110.dto.reserveGoodsOrder.ReserveGoodsOrderDto;
+import com.java110.dto.reserveGoodsOrderTime.ReserveGoodsOrderTimeDto;
+import com.java110.dto.reserveParams.ReserveParamsDto;
+import com.java110.intf.community.ICommunitySpacePersonTimeV1InnerServiceSMO;
+import com.java110.intf.community.ICommunitySpacePersonV1InnerServiceSMO;
+import com.java110.intf.community.ICommunitySpaceV1InnerServiceSMO;
+import com.java110.intf.store.IReserveGoodsOrderTimeV1InnerServiceSMO;
+import com.java110.intf.store.IReserveGoodsOrderV1InnerServiceSMO;
+import com.java110.intf.store.IReserveGoodsV1InnerServiceSMO;
+import com.java110.po.communitySpacePerson.CommunitySpacePersonPo;
+import com.java110.po.communitySpacePersonTime.CommunitySpacePersonTimePo;
+import com.java110.po.reserveGoodsOrder.ReserveGoodsOrderPo;
+import com.java110.po.reserveGoodsOrderTime.ReserveGoodsOrderTimePo;
+import com.java110.utils.exception.CmdException;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+
+
+@Java110CmdDoc(title = "商品预约",
+        description = "商品预约手机端发起支付",
+        httpMethod = "post",
+        url = "http://{ip}:{port}/app/payment.unifiedPayment",
+        resource = "acctDoc",
+        author = "吴学文",
+        serviceCode = "payment.unifiedPayment.venueReservation"
+)
+
+@Java110ParamsDoc(params = {
+        @Java110ParamDoc(name = "business", length = 64, remark = "支付场景,比如场地预约 为 venueReservation"),
+        @Java110ParamDoc(name = "payAdapt", length = 64, remark = "支付适配器,非必填"),
+        @Java110ParamDoc(name = "tradeType", length = 64, remark = "支付类型 NATIVE JSAPI APP"),
+        @Java110ParamDoc(name = "communityId", length = 30, remark = "小区ID"),
+        @Java110ParamDoc(name = "tradeType", length = 30, remark = "支付类型 NATIVE JSAPI APP"),
+        @Java110ParamDoc(name = "personName", length = 30, remark = "预约人"),
+        @Java110ParamDoc(name = "personTel", length = 30, remark = "预约电话"),
+        @Java110ParamDoc(name = "appointmentTime", length = 30, remark = "预约时间 YYYY-MM-DD"),
+        @Java110ParamDoc(name = "payWay", length = 30, remark = "支付方式"),
+        @Java110ParamDoc(name = "spaces", type = "Array", length = 0, remark = "场地"),
+        @Java110ParamDoc(parentNodeName = "spaces", name = "spaceId", length = 30, remark = "场地"),
+        @Java110ParamDoc(parentNodeName = "spaces", name = "openTimes", type = "Array", length = 0, remark = "预约时间"),
+        @Java110ParamDoc(parentNodeName = "openTimes", name = "hours", length = 10, remark = "预约小时"),
+
+})
+
+@Java110ResponseDoc(
+        params = {
+                @Java110ParamDoc(name = "code", type = "int", length = 11, defaultValue = "0", remark = "返回编号,0 成功 100 成功不需要唤起支付窗口,直接支付成功,可能从账户等做了扣款,其他失败"),
+                @Java110ParamDoc(name = "msg", type = "String", length = 250, defaultValue = "成功", remark = "描述"),
+        }
+)
+
+@Java110ExampleDoc(
+        reqBody = "{       \"business\":\"venueReservation\",\"communityId\":\"123123\",\n" +
+                "         personName:\"张三\",\n" +
+                "         personTel:\"18909711111\",\n" +
+                "         appointmentTime:\"2022-12-12\",\n" +
+                "         payWay:\"2\",\n" +
+                "         communityId:\"123123\",          spaces:[{spaceId:'123',openTimes:[{hours:1},{hours:2}]}]\n" +
+                " }",
+        resBody = "{'code':0,'msg':'成功'}"
+)
+
+/**
+ * 场地预约
+ */
+@Service("reserveGoods")
+public class ReserveGoodsPaymentBusiness implements IPaymentBusiness {
+
+
+    public static final String CODE_PREFIX_ID = "10";
+    @Autowired
+    private IReserveGoodsOrderV1InnerServiceSMO reserveGoodsOrderV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IReserveGoodsOrderTimeV1InnerServiceSMO reserveGoodsOrderTimeV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IReserveGoodsV1InnerServiceSMO reserveGoodsV1InnerServiceSMOImpl;
+
+    /**
+     * @param context
+     * @param reqJson{ personName:"",
+     *                 personTel:"",
+     *                 appointmentTime:"",
+     *                 payWay:"",
+     *                 communityId:"",
+     *                 spaces:[{spaceId:'123',openTimes:[{hours:1},{hours:2}]}]
+     *                 }
+     * @return
+     */
+    @Override
+    public PaymentOrderDto unified(ICmdDataFlowContext context, JSONObject reqJson) {
+
+        //Assert.hasKeyAndValue(reqJson, "spaceId", "请求报文中未包含spaceId");
+        Assert.hasKeyAndValue(reqJson, "personName", "请求报文中未包含personName");
+        Assert.hasKeyAndValue(reqJson, "personTel", "请求报文中未包含personTel");
+        Assert.hasKeyAndValue(reqJson, "appointmentTime", "请求报文中未包含appointmentTime");
+        Assert.hasKeyAndValue(reqJson, "payWay", "请求报文中未包含payWay");
+        Assert.hasKeyAndValue(reqJson, "communityId", "请求报文中未包含communityId");
+
+        if (!reqJson.containsKey("goodss")) {
+            throw new IllegalArgumentException("未包含 场地");
+        }
+
+        JSONArray goodss = reqJson.getJSONArray("goodss");
+
+
+        JSONObject goodsInfo = null;
+        BigDecimal money = new BigDecimal(0);
+        for (int goodsIndex = 0; goodsIndex < goodss.size(); goodsIndex++) {
+            goodsInfo = goodss.getJSONObject(goodsIndex);
+            assertGoodsAndComputeMoney(goodsInfo);
+            money = money.add(new BigDecimal(goodsInfo.getDoubleValue("moneyDec")));
+        }
+
+        PaymentOrderDto paymentOrderDto = new PaymentOrderDto();
+        paymentOrderDto.setOrderId(GenerateCodeFactory.getOId());
+        paymentOrderDto.setMoney(money.doubleValue());
+        paymentOrderDto.setName("预约费用");
+
+        reqJson.put("receivableAmount", money.doubleValue());
+        reqJson.put("receivedAmount", money.doubleValue());
+        return paymentOrderDto;
+    }
+
+    private void assertGoodsAndComputeMoney(JSONObject reqJson) {
+
+        ReserveGoodsDto reserveGoodsDto = new ReserveGoodsDto();
+        reserveGoodsDto.setGoodsId(reqJson.getString("goodsId"));
+        List<ReserveGoodsDto> reserveGoodsDtos = reserveGoodsV1InnerServiceSMOImpl.queryReserveGoodss(reserveGoodsDto);
+        if ("1001".equals(reqJson.getString("type"))) {
+            Assert.listOnlyOne(reserveGoodsDtos, "就餐不存在");
+        } else {
+            Assert.listOnlyOne(reserveGoodsDtos, "服务不存在");
+        }
+
+        checkAppointmentTime(reqJson, reserveGoodsDtos.get(0));
+
+        if (!reqJson.containsKey("hours")) {
+            throw new IllegalArgumentException("未包含 预约时间");
+        }
+
+        JSONArray hours = reqJson.getJSONArray("hours");
+
+        if (hours == null || hours.size() < 1) {
+            throw new IllegalArgumentException("未包含 预约时间");
+        }
+        ReserveGoodsOrderTimeDto reserveGoodsOrderTimeDto = null;
+        int flag = 0;
+        int quantity = 0;
+        quantity = Integer.parseInt(reqJson.getString("quantity"));
+        for (int timeIndex = 0; timeIndex < hours.size(); timeIndex++) {
+            reserveGoodsOrderTimeDto = new ReserveGoodsOrderTimeDto();
+            reserveGoodsOrderTimeDto.setCommunityId(reqJson.getString("communityId"));
+            reserveGoodsOrderTimeDto.setAppointmentTime(reqJson.getString("appointmentTime"));
+            reserveGoodsOrderTimeDto.setHours(hours.getString(timeIndex));
+            reserveGoodsOrderTimeDto.setGoodsId(reqJson.getString("goodsId"));
+            flag = reserveGoodsOrderTimeV1InnerServiceSMOImpl.queryReserveGoodsOrderTimesCount(reserveGoodsOrderTimeDto);
+            if (flag > 0) {
+                throw new CmdException(reqJson.getString("appointmentTime") + "," + hours.getString(timeIndex) + "已经被预约");
+            }
+            if (quantity > Integer.parseInt(reserveGoodsDtos.get(0).getHoursMaxQuantity())) {
+                throw new CmdException("预约数量超过设定数量");
+            }
+        }
+
+        BigDecimal moneyDec = new BigDecimal(hours.size())
+                .multiply(new BigDecimal(quantity))
+                .multiply(new BigDecimal(Double.parseDouble(reserveGoodsDtos.get(0).getPrice())))
+                .setScale(2, BigDecimal.ROUND_HALF_UP);
+        reqJson.put("moneyDec", moneyDec.doubleValue());
+    }
+
+    private void checkAppointmentTime(JSONObject reqJson, ReserveGoodsDto reserveGoodsDto) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(DateUtil.getDateFromStringB(reqJson.getString("appointmentTime")));
+        int day;
+        String[] days = reserveGoodsDto.getParamWayText().split(",");
+
+        if (ReserveParamsDto.PARAM_WAY_DAY.equals(reserveGoodsDto.getParamWay())) {
+            day = calendar.get(Calendar.DAY_OF_MONTH);
+            if (!Arrays.asList(days).contains(day + "")) {
+                throw new CmdException(reqJson.getString("appointmentTime") + "不能预约");
+            }
+        } else {
+            day = calendar.get(Calendar.DAY_OF_WEEK);
+            boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY);
+            //获取周几
+            //若一周第一天为星期天,则-1
+            if (isFirstSunday) {
+                day = day - 1;
+                if (day == 0) {
+                    day = 7;
+                }
+            }
+            if (!Arrays.asList(days).contains(day + "")) {
+                throw new CmdException(reqJson.getString("appointmentTime") + "不能预约");
+            }
+        }
+    }
+
+    @Override
+    public void notifyPayment(PaymentOrderDto paymentOrderDto, JSONObject reqJson) {
+        JSONArray goodss = reqJson.getJSONArray("goodss");
+        JSONObject goodsObj = null;
+        for (int goodsIndex = 0; goodsIndex < goodss.size(); goodsIndex++) {
+            goodsObj = goodss.getJSONObject(goodsIndex);
+            ReserveGoodsOrderPo reserveGoodsOrderPo = BeanConvertUtil.covertBean(reqJson, ReserveGoodsOrderPo.class);
+            reserveGoodsOrderPo.setOrderId(GenerateCodeFactory.getGeneratorId(CODE_PREFIX_ID));
+            reserveGoodsOrderPo.setExtOrderId(paymentOrderDto.getOrderId());
+            reserveGoodsOrderPo.setGoodsId(goodsObj.getString("goodsId"));
+
+            reserveGoodsOrderPo.setState(ReserveGoodsOrderDto.STATE_W);
+
+            int flag = reserveGoodsOrderV1InnerServiceSMOImpl.saveReserveGoodsOrder(reserveGoodsOrderPo);
+
+            if (flag < 1) {
+                throw new CmdException("保存数据失败");
+            }
+
+            JSONArray hours = reqJson.getJSONArray("hours");
+
+            ReserveGoodsOrderTimePo reserveGoodsOrderTimePo = null;
+            for (int timeIndex = 0; timeIndex < hours.size(); timeIndex++) {
+                reserveGoodsOrderTimePo = new ReserveGoodsOrderTimePo();
+                reserveGoodsOrderTimePo.setCommunityId(reserveGoodsOrderPo.getCommunityId());
+                reserveGoodsOrderTimePo.setGoodsId(reserveGoodsOrderPo.getGoodsId());
+                reserveGoodsOrderTimePo.setOrderId(reserveGoodsOrderPo.getOrderId());
+                reserveGoodsOrderTimePo.setHours(hours.getString(timeIndex));
+                reserveGoodsOrderTimePo.setQuantity(goodss.getJSONObject(goodsIndex).getString("quantity"));
+                reserveGoodsOrderTimePo.setTimeId(GenerateCodeFactory.getGeneratorId(CODE_PREFIX_ID));
+                reserveGoodsOrderTimePo.setState(CommunitySpacePersonTimeDto.STATE_WAIT_CONFIRM);
+                reserveGoodsOrderTimeV1InnerServiceSMOImpl.saveReserveGoodsOrderTime(reserveGoodsOrderTimePo);
+            }
+        }
+
+    }
+}