|
|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|