Your Name
2022-12-09 bdf52e1a16fe1cdf60daff83a63e505832451da5
开发完成预约功能
1个文件已添加
1个文件已修改
381 ■■■■ 已修改文件
java110-bean/src/main/java/com/java110/po/reserveGoodsOrder/ReserveGoodsOrderPo.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-acct/src/main/java/com/java110/acct/payment/business/reserve/ReserveGoodsPaymentBusiness.java 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/po/reserveGoodsOrder/ReserveGoodsOrderPo.java
@@ -17,6 +17,7 @@
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 @@
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;
    }
}
service-acct/src/main/java/com/java110/acct/payment/business/reserve/ReserveGoodsPaymentBusiness.java
New file
@@ -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);
            }
        }
    }
}