Commit 83ff5968 by caiyt

Merge remote-tracking branch 'origin/v2' into v2

# Conflicts:
#	soss-framework/src/main/java/com/soss/framework/web/service/WeixinServiceImpl.java
parents 7e120bd0 541843a9
...@@ -9,6 +9,7 @@ import com.soss.framework.web.service.TokenService; ...@@ -9,6 +9,7 @@ import com.soss.framework.web.service.TokenService;
import com.soss.framework.web.service.WeixinServiceImpl; import com.soss.framework.web.service.WeixinServiceImpl;
import com.soss.system.domain.Customer; import com.soss.system.domain.Customer;
import com.soss.system.domain.Shop; import com.soss.system.domain.Shop;
import com.soss.system.domain.po.LocationPo;
import com.soss.system.service.ICustomerService; import com.soss.system.service.ICustomerService;
import com.soss.system.service.impl.AppServiceImpl; import com.soss.system.service.impl.AppServiceImpl;
import com.soss.system.service.impl.OrderTakingServiceImpl; import com.soss.system.service.impl.OrderTakingServiceImpl;
...@@ -19,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -19,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -102,6 +104,31 @@ public class WeixinController { ...@@ -102,6 +104,31 @@ public class WeixinController {
return weixinService.wxNotifyTest(orderNo); return weixinService.wxNotifyTest(orderNo);
} }
@RequestMapping("/v2/getShop")
public AjaxResult getShopV2(HttpServletRequest request, @RequestParam(required = false) String lng, @RequestParam(required = false) String lat) throws ParseException {
LoginUser loginUser = tokenService.getLoginUser(request);
boolean testFlag = false;
if (loginUser != null) {
Customer customer = customerService.selectCustById(loginUser.getOpenId());
if (customer != null) {
testFlag = customer.getTestFlag();
}
}
return AjaxResult.success(appService.getShop(loginUser, lng, lat, testFlag));
}
@RequestMapping("/v2/getLocationShops")
public AjaxResult getSameLocationShops(HttpServletRequest request, @RequestBody LocationPo locationPo) throws ParseException {
LoginUser loginUser = tokenService.getLoginUser(request);
boolean testFlag = false;
if (loginUser != null) {
Customer customer = customerService.selectCustById(loginUser.getOpenId());
if (customer != null) {
testFlag = customer.getTestFlag();
}
}
return AjaxResult.success(appService.getSameLocationShops(loginUser, locationPo, testFlag));
}
@RequestMapping("/getShop") @RequestMapping("/getShop")
public AjaxResult getShop(HttpServletRequest request, @RequestParam(required = false) String lng, @RequestParam(required = false) String lat) { public AjaxResult getShop(HttpServletRequest request, @RequestParam(required = false) String lng, @RequestParam(required = false) String lat) {
...@@ -117,7 +144,7 @@ public class WeixinController { ...@@ -117,7 +144,7 @@ public class WeixinController {
} }
@RequestMapping("/getArea") @RequestMapping("/getArea")
public AjaxResult getArea(HttpServletRequest request, @RequestParam(required = false) String lng, @RequestParam(required = false) String lat) { public AjaxResult getArea(HttpServletRequest request, @RequestParam(required = false) String lng, @RequestParam(required = false) String lat) throws ParseException {
LoginUser loginUser = tokenService.getLoginUser(request); LoginUser loginUser = tokenService.getLoginUser(request);
List<JSONObject> area; List<JSONObject> area;
if (loginUser == null || StringUtils.isEmpty(loginUser.getOpenId())) { if (loginUser == null || StringUtils.isEmpty(loginUser.getOpenId())) {
...@@ -129,7 +156,6 @@ public class WeixinController { ...@@ -129,7 +156,6 @@ public class WeixinController {
return AjaxResult.success(area); return AjaxResult.success(area);
} }
@GetMapping(value = "/infoByShop") @GetMapping(value = "/infoByShop")
public AjaxResult infoByShop(Long shopId) { public AjaxResult infoByShop(Long shopId) {
return AjaxResult.success(orderTakingService.getInfoByShop(shopId)); return AjaxResult.success(orderTakingService.getInfoByShop(shopId));
......
import java.util.Calendar; import com.soss.common.utils.DateUtils;
import com.soss.system.domain.Shop;
import java.text.ParseException;
public class JavaTest { public class JavaTest {
public static void main(String[] args) { public static void main(String[] args) throws ParseException {
Calendar calendar = Calendar.getInstance(); Shop shop = new Shop();
System.out.println(calendar.get(Calendar.DAY_OF_WEEK) - 1); shop.setStartTime("14:21");
shop.setEndTime("18:00");
System.out.println(DateUtils.isEffectiveDate(shop.getStartTime(), shop.getEndTime()));
// Shop shop = new Shop();
// shop.setLat("39.91571");
// shop.setLng("116.463485");
// String lat = "39.789916";
// String lng = "116.531469";
// double realDistance = DistanceUtil.getRealDistance(Double.parseDouble(lng), Double.parseDouble(lat), Double.parseDouble(shop.getLng()), Double.parseDouble(shop.getLat()));
// System.out.println(realDistance);
// Calendar calendar = Calendar.getInstance();
// System.out.println(calendar.get(Calendar.DAY_OF_WEEK) - 1);
} }
} }
...@@ -6,6 +6,7 @@ import java.lang.management.ManagementFactory; ...@@ -6,6 +6,7 @@ import java.lang.management.ManagementFactory;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.*; import java.time.*;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
/** /**
...@@ -29,6 +30,38 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { ...@@ -29,6 +30,38 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
public static boolean isEffectiveDate(String shopStartTime, String shopEndTime) throws ParseException {
String format = "HH:mm";
SimpleDateFormat sf = new SimpleDateFormat("HH:mm");
String now = sf.format(new Date());
Date nowTime = new SimpleDateFormat(format).parse(now);
Date startTime = new SimpleDateFormat(format).parse(shopStartTime);
Date endTime = new SimpleDateFormat(format).parse(shopEndTime);
return DateUtils.isEffectiveDate(nowTime, startTime, endTime);
}
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime()
|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
/** /**
* 获取当前Date型日期 * 获取当前Date型日期
* *
......
...@@ -12,13 +12,16 @@ import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; ...@@ -12,13 +12,16 @@ import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.WxPayService;
import com.github.wxpay.sdk.WXPayUtil; import com.github.wxpay.sdk.WXPayUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.soss.common.core.domain.entity.SysUser; import com.soss.common.core.domain.entity.SysUser;
import com.soss.common.core.domain.model.LoginUser; import com.soss.common.core.domain.model.LoginUser;
import com.soss.common.enums.RefundState; import com.soss.common.enums.RefundState;
import com.soss.common.enums.ShopState; import com.soss.common.enums.ShopState;
import com.soss.common.exception.ServiceException; import com.soss.common.exception.ServiceException;
import com.soss.common.utils.QRCodeUtil;
import com.soss.common.utils.StringUtils; import com.soss.common.utils.StringUtils;
import com.soss.common.utils.ip.IpUtils; import com.soss.common.utils.ip.IpUtils;
import com.soss.common.utils.sign.Base64; import com.soss.common.utils.sign.Base64;
...@@ -54,8 +57,6 @@ import javax.crypto.Cipher; ...@@ -54,8 +57,6 @@ import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
...@@ -64,7 +65,6 @@ import java.math.BigDecimal; ...@@ -64,7 +65,6 @@ import java.math.BigDecimal;
import java.net.InetAddress; import java.net.InetAddress;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.spec.AlgorithmParameterSpec; import java.security.spec.AlgorithmParameterSpec;
import java.util.List;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
...@@ -94,6 +94,8 @@ public class WeixinServiceImpl { ...@@ -94,6 +94,8 @@ public class WeixinServiceImpl {
private ShopMapper shopMapper; private ShopMapper shopMapper;
@Autowired @Autowired
private OssFileServiceImpl ossFileService; private OssFileServiceImpl ossFileService;
@Autowired
private AppServiceImpl appService;
private final ReentrantLock lock = new ReentrantLock(); private final ReentrantLock lock = new ReentrantLock();
...@@ -623,7 +625,7 @@ public class WeixinServiceImpl { ...@@ -623,7 +625,7 @@ public class WeixinServiceImpl {
return WxPayNotifyResponse.fail("回调有误!"); return WxPayNotifyResponse.fail("回调有误!");
} }
public List<JSONObject> getArea(String lng, String lat, Boolean testFlag) { public List<JSONObject> getArea(String lng, String lat, Boolean testFlag) throws ParseException {
String provinceString ="[value ='%s'][0].label"; String provinceString ="[value ='%s'][0].label";
String cityString ="[value='%s'][0].children[value='%s'][0].label"; String cityString ="[value='%s'][0].children[value='%s'][0].label";
String zoneString = "[value='%s'][0].children[value='%s'][0].children[value='%s'][0].label"; String zoneString = "[value='%s'][0].children[value='%s'][0].children[value='%s'][0].label";
...@@ -641,8 +643,10 @@ public class WeixinServiceImpl { ...@@ -641,8 +643,10 @@ public class WeixinServiceImpl {
double realDistance = DistanceUtil.getRealDistance(Double.parseDouble(lng), Double.parseDouble(lat), Double.parseDouble(shop1.getLng()), Double.parseDouble(shop1.getLat())); double realDistance = DistanceUtil.getRealDistance(Double.parseDouble(lng), Double.parseDouble(lat), Double.parseDouble(shop1.getLng()), Double.parseDouble(shop1.getLat()));
shop1.setRealDistance(realDistance); shop1.setRealDistance(realDistance);
shop1.setDistance(DistanceUtil.getDistanceDesc(realDistance)); shop1.setDistance(DistanceUtil.getDistanceDesc(realDistance));
appService.perfectOrderState(shop1, lng, lat);
} else { } else {
shop1.setDistance("-1"); shop1.setDistance("-1");
shop1.setOrderState(1);
} }
String province = shop1.getProvince(); String province = shop1.getProvince();
if(proString.contains(province)){ if(proString.contains(province)){
......
...@@ -14,13 +14,12 @@ import java.util.List; ...@@ -14,13 +14,12 @@ import java.util.List;
/** /**
* 店铺对象 shop * 店铺对象 shop
* *
* @author zxq * @author zxq
* @date 2022-04-28 * @date 2022-04-28
*/ */
@Data @Data
public class Shop extends BaseEntity public class Shop extends BaseEntity {
{
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** 主键 */ /** 主键 */
...@@ -135,6 +134,15 @@ public class Shop extends BaseEntity ...@@ -135,6 +134,15 @@ public class Shop extends BaseEntity
private Integer salesVolume; private Integer salesVolume;
/**
* 是否允许下单, 1-可以下单,0-不可以下单
*/
private Integer orderState;
/**
* 不允许下单原因
*/
private String stateDesc;
public Shop() { public Shop() {
super(); super();
} }
...@@ -154,23 +162,23 @@ public class Shop extends BaseEntity ...@@ -154,23 +162,23 @@ public class Shop extends BaseEntity
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId()) .append("id", getId())
.append("name", getName()) .append("name", getName())
.append("code", getCode()) .append("code", getCode())
.append("lng", getLng()) .append("lng", getLng())
.append("lat", getLat()) .append("lat", getLat())
.append("remarks", getRemarks()) .append("remarks", getRemarks())
.append("startTime", getStartTime()) .append("startTime", getStartTime())
.append("endTime", getEndTime()) .append("endTime", getEndTime())
.append("address", getAddress()) .append("address", getAddress())
.append("province", getProvince()) .append("province", getProvince())
.append("city", getCity()) .append("city", getCity())
.append("zone", getZone()) .append("zone", getZone())
.append("state", getState()) .append("state", getState())
.append("createdAt", getCreatedAt()) .append("createdAt", getCreatedAt())
.append("updatedAt", getUpdatedAt()) .append("updatedAt", getUpdatedAt())
.append("isDefault", getIsDefault()) .append("isDefault", getIsDefault())
.toString(); .toString();
} }
} }
package com.soss.system.domain.po;
import com.soss.common.utils.StringUtils;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel("优惠券请求类")
public class LocationPo {
private String lng;
private String lat;
private String province;
private String city;
private String area;
public boolean isEmpty() {
return StringUtils.isEmpty(lng) || StringUtils.isEmpty(lat) || StringUtils.isEmpty(province) || StringUtils.isEmpty(city) || StringUtils.isEmpty(area);
}
}
package com.soss.system.domain.vo;
import com.soss.common.utils.StringUtils;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel("优惠券请求类")
public class LocationVo {
private String lng;
private String lat;
private String province;
private String city;
private String area;
private String provinceCode;
private String cityCode;
private String areaCode;
}
package com.soss.system.mapper; package com.soss.system.mapper;
import com.soss.system.domain.Shop; import com.soss.system.domain.Shop;
import com.soss.system.domain.vo.LocationVo;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
/** /**
* 店铺Mapper接口 * 店铺Mapper接口
* *
* @author zxq * @author zxq
* @date 2022-04-28 * @date 2022-04-28
*/ */
...@@ -53,7 +54,7 @@ public interface ShopMapper { ...@@ -53,7 +54,7 @@ public interface ShopMapper {
/** /**
* 修改店铺 * 修改店铺
* *
* @param shop 店铺 * @param shop 店铺
* @return 结果 * @return 结果
*/ */
...@@ -61,7 +62,7 @@ public interface ShopMapper { ...@@ -61,7 +62,7 @@ public interface ShopMapper {
/** /**
* 删除店铺 * 删除店铺
* *
* @param id 店铺主键 * @param id 店铺主键
* @return 结果 * @return 结果
*/ */
...@@ -69,11 +70,17 @@ public interface ShopMapper { ...@@ -69,11 +70,17 @@ public interface ShopMapper {
/** /**
* 批量删除店铺 * 批量删除店铺
* *
* @param ids 需要删除的数据主键集合 * @param ids 需要删除的数据主键集合
* @return 结果 * @return 结果
*/ */
public int deleteShopByIds(String[] ids); public int deleteShopByIds(String[] ids);
void updateNoDefault(); void updateNoDefault();
List<Shop> selectEnableShops(@Param("states") List<Integer> states);
List<Shop> selectDefaultSameLocationShops(@Param("states") List<Integer> states);
List<Shop> selectSameLocationShops(@Param("states") List<Integer> states, @Param("location") LocationVo locationVo);
} }
...@@ -2,15 +2,21 @@ package com.soss.system.service.impl; ...@@ -2,15 +2,21 @@ package com.soss.system.service.impl;
import com.soss.common.core.domain.model.LoginUser; import com.soss.common.core.domain.model.LoginUser;
import com.soss.common.enums.ShopState; import com.soss.common.enums.ShopState;
import com.soss.common.utils.DateUtils;
import com.soss.common.utils.StringUtils;
import com.soss.system.domain.Order; import com.soss.system.domain.Order;
import com.soss.system.domain.Shop; import com.soss.system.domain.Shop;
import com.soss.system.domain.po.LocationPo;
import com.soss.system.domain.vo.LocationVo;
import com.soss.system.mapper.ShopMapper; import com.soss.system.mapper.ShopMapper;
import com.soss.system.utils.AreaUtil;
import com.soss.system.utils.DistanceUtil; import com.soss.system.utils.DistanceUtil;
import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.text.ParseException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
...@@ -23,6 +29,140 @@ public class AppServiceImpl { ...@@ -23,6 +29,140 @@ public class AppServiceImpl {
private ShopServiceImpl shopService; private ShopServiceImpl shopService;
@Autowired @Autowired
private OrderServiceImpl orderService; private OrderServiceImpl orderService;
@Autowired
private AreaUtil areaUtil;
public Shop getShop(LoginUser loginUser, String lng, String lat, Boolean testFlag) throws ParseException {
Shop shop = null;
if (StringUtils.isEmpty(lng) || StringUtils.isEmpty(lat)) {
// 未授权位置
if (loginUser == null) {
// 未登录,返回默认店铺
shop = getDefaultShop();
} else {
// 已登录
List<Order> myOrder = orderService.getMyOrder(loginUser.getOpenId());
if (CollectionUtils.isEmpty(myOrder)) {
// 未下过单返回默认店铺
shop = getDefaultShop();
} else {
// 返回最后下单店铺
Order order = myOrder.get(0);
shop = shopService.selectShopById(order.getShopId());
}
}
} else {
// 授权了位置
List<Integer> states = null;
if (BooleanUtils.isTrue(testFlag)) {
states = Arrays.asList(ShopState.TESTING.getState(), ShopState.OPEN.getState());
} else {
states = Arrays.asList(ShopState.OPEN.getState(), ShopState.CLOSE.getState());
}
List<Shop> shops = shopMapper.selectEnableShops(states); // 获取所有非关闭的店铺
if (CollectionUtils.isEmpty(shops)) {
return null;
}
for (Shop s : shops) { // 获取所有店铺距离
double realDistance = DistanceUtil.getRealDistance(Double.parseDouble(lng), Double.parseDouble(lat), Double.parseDouble(s.getLng()), Double.parseDouble(s.getLat()));
s.setRealDistance(realDistance);
}
shops.sort(Comparator.comparing(Shop::getRealDistance)); // 按距离排序
for (Shop s : shops) {
if (perfectOrderState(s, lng, lat)) { // 是否能下单
shop = s;
}
}
if (shop == null) { // 没有能下单店铺选择最近的店铺
shop = shops.get(0);
}
}
if (shop.getOrderState() == null) {
perfectOrderState(shop, lng, lat);
}
return shop;
}
public boolean perfectOrderState(Shop shop, String lng, String lat) throws ParseException {
if (shop == null) {
return false;
}
// 状态已停止营业
if (shop.getState() != 1) {
shop.setOrderState(0);
shop.setStateDesc("门店已暂停营业");
return false;
}
// 不在营业时间范围内
if (!DateUtils.isEffectiveDate(shop.getStartTime(), shop.getEndTime())) {
shop.setOrderState(0);
shop.setStateDesc("门店已休息");
return false;
}
// 超出最大配送距离10KM 或 超出店铺设置最大距离
if (!StringUtils.isEmpty(lng) && !StringUtils.isEmpty(lat)) {
double realDistance = DistanceUtil.getRealDistance(Double.parseDouble(lng), Double.parseDouble(lat), Double.parseDouble(shop.getLng()), Double.parseDouble(shop.getLat()));
double realKm = realDistance / 1000;
double shopLimit = shop.getDistanceLimit() == null ? 0 : shop.getDistanceLimit();
if (realKm > 10 || realKm > shopLimit) {
shop.setOrderState(0);
shop.setStateDesc("距离较远,门店暂停接单");
return false;
}
}
shop.setOrderState(1);
return true;
}
public List<Shop> getSameLocationShops(LoginUser loginUser, LocationPo locationPo, Boolean testFlag) throws ParseException {
List<Integer> states = null;
if (BooleanUtils.isTrue(testFlag)) {
states = Arrays.asList(ShopState.TESTING.getState(), ShopState.OPEN.getState());
} else {
states = Arrays.asList(ShopState.OPEN.getState(), ShopState.CLOSE.getState());
}
List<Shop> shops = null;
if (locationPo == null || locationPo.isEmpty()) {
// 未授权位置,返回默认店铺相同区域的所有店铺
shops = shopMapper.selectDefaultSameLocationShops(states);
} else {
// 授权了位置
LocationVo locationVo = areaUtil.translateLocation(locationPo);
if (locationVo == null) {
shops = shopMapper.selectDefaultSameLocationShops(states);
} else {
shops = shopMapper.selectSameLocationShops(states, locationVo);
}
}
if (CollectionUtils.isEmpty(shops)) {
return null;
}
for (Shop s : shops) {
if (locationPo == null || locationPo.isEmpty()) {
s.setRealDistance(0d);
s.setDistance("-1");
s.setOrderState(1);
} else {
// 获取所有店铺距离
double realDistance = DistanceUtil.getRealDistance(Double.parseDouble(locationPo.getLng()), Double.parseDouble(locationPo.getLat()), Double.parseDouble(s.getLng()), Double.parseDouble(s.getLat()));
s.setRealDistance(realDistance);
s.setDistance(DistanceUtil.getDistanceDesc(realDistance));
perfectOrderState(s, locationPo.getLng(), locationPo.getLat());
}
}
shops.sort(Comparator.comparing(Shop::getRealDistance)); // 按距离排序
return shops;
}
public Shop getShop(LoginUser loginUser) { public Shop getShop(LoginUser loginUser) {
if (loginUser == null) { if (loginUser == null) {
......
package com.soss.system.service.impl; package com.soss.system.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.soss.common.exception.ServiceException; import com.soss.common.exception.ServiceException;
import com.soss.system.domain.Machine; import com.soss.system.domain.*;
import com.soss.system.domain.ShopGoods;
import com.soss.system.domain.Spec;
import com.soss.system.domain.SpecRule;
import com.soss.system.domain.vo.orderTaking.SkuVo; import com.soss.system.domain.vo.orderTaking.SkuVo;
import com.soss.system.mapper.*; import com.soss.system.mapper.*;
import com.soss.system.service.IShopGoodsService; import com.soss.system.service.IShopGoodsService;
...@@ -13,10 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -13,10 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -118,18 +113,15 @@ public class ShopGoodsServiceImpl implements IShopGoodsService { ...@@ -118,18 +113,15 @@ public class ShopGoodsServiceImpl implements IShopGoodsService {
return null; return null;
} }
Map<Long, SpecRule> selloutRules = new HashMap<>(); Set<Long> selloutRules = new HashSet<>();
Map<Long, SpecRule> sellinRules = new HashMap<>(); Set<Long> sellinRules = new HashSet<>();
List<SkuVo> selloutSkus = skuMap.get("2"); List<SkuVo> selloutSkus = skuMap.get("2");
if (!CollectionUtils.isEmpty(selloutSkus)) { if (!CollectionUtils.isEmpty(selloutSkus)) {
selloutSkus.forEach(skuVo -> { selloutSkus.forEach(skuVo -> {
List<SpecRule> rules = JSON.parseArray(skuVo.getRulesString(), SpecRule.class); List<SpecRule> rules = JSON.parseArray(skuVo.getRulesString(), SpecRule.class);
if (!CollectionUtils.isEmpty(rules)) { if (!CollectionUtils.isEmpty(rules)) {
rules.forEach(rule -> { rules.forEach(rule -> selloutRules.add(rule.getId()));
rule.setState(2);
selloutRules.put(rule.getId(), rule);
});
} }
}); });
} }
...@@ -139,42 +131,62 @@ public class ShopGoodsServiceImpl implements IShopGoodsService { ...@@ -139,42 +131,62 @@ public class ShopGoodsServiceImpl implements IShopGoodsService {
sellinSkus.forEach(skuVo -> { sellinSkus.forEach(skuVo -> {
List<SpecRule> rules = JSON.parseArray(skuVo.getRulesString(), SpecRule.class); List<SpecRule> rules = JSON.parseArray(skuVo.getRulesString(), SpecRule.class);
if (!CollectionUtils.isEmpty(rules)) { if (!CollectionUtils.isEmpty(rules)) {
rules.forEach(rule -> { rules.forEach(rule -> sellinRules.add(rule.getId()));
rule.setState(1);
sellinRules.put(rule.getId(), rule);
});
} }
}); });
} }
// 从售罄sku选项列表中删除 未售罄sku选项 // 从售罄sku选项列表中删除 未售罄sku选项
sellinRules.values().forEach(rule -> selloutRules.remove(rule.getId())); sellinRules.forEach(sellinId -> selloutRules.remove(sellinId));
Map<Long, List<SpecRule>> selloutRulesBySpec = selloutRules.values().stream().collect(Collectors.groupingBy(SpecRule::getSpecId)); Goods goods = goodsMapper.selectGoodsById(goodsId);
Map<Long, List<SpecRule>> sellinRulesBySpec = sellinRules.values().stream().collect(Collectors.groupingBy(SpecRule::getSpecId)); if (goods == null) {
List<Long> specIds = new ArrayList<>();
specIds.addAll(sellinRules.values().stream().map(SpecRule::getSpecId).collect(Collectors.toList()));
specIds.addAll(selloutRules.values().stream().map(SpecRule::getSpecId).collect(Collectors.toList()));
// 构建返回数据
List<Spec> specVos = specMapper.selectSpecByIds(specIds);
if (CollectionUtils.isEmpty(specVos)) {
return null; return null;
} }
specVos.forEach(spec -> { List<Spec> specs = JSONArray.parseArray(goods.getSpec(), Spec.class);
if (CollectionUtils.isEmpty(spec.getSpecRules())) { if (CollectionUtils.isEmpty(specs)) {
spec.setSpecRules(new ArrayList<>()); return specs;
} }
if (!CollectionUtils.isEmpty(sellinRulesBySpec.get(spec.getId()))) { specs.forEach(spec -> {
spec.getSpecRules().addAll(sellinRulesBySpec.get(spec.getId())); List<SpecRule> rules = spec.getSpecRules();
} if (CollectionUtils.isEmpty(rules)) {
if (!CollectionUtils.isEmpty(selloutRulesBySpec.get(spec.getId()))) { return;
spec.getSpecRules().addAll(selloutRulesBySpec.get(spec.getId()));
} }
rules.forEach(rule -> {
if (sellinRules.contains(rule.getId())) {
rule.setState(1);
} else {
rule.setState(0);
}
});
}); });
return specVos;
// Map<Long, List<SpecRule>> selloutRulesBySpec = selloutRules.values().stream().collect(Collectors.groupingBy(SpecRule::getSpecId));
// Map<Long, List<SpecRule>> sellinRulesBySpec = sellinRules.values().stream().collect(Collectors.groupingBy(SpecRule::getSpecId));
//
// List<Long> specIds = new ArrayList<>();
// specIds.addAll(sellinRules.values().stream().map(SpecRule::getSpecId).collect(Collectors.toList()));
// specIds.addAll(selloutRules.values().stream().map(SpecRule::getSpecId).collect(Collectors.toList()));
//
// // 构建返回数据
// List<Spec> specVos = specMapper.selectSpecByIds(specIds);
// if (CollectionUtils.isEmpty(specVos)) {
// return null;
// }
// specVos.forEach(spec -> {
// if (CollectionUtils.isEmpty(spec.getSpecRules())) {
// spec.setSpecRules(new ArrayList<>());
// }
// if (!CollectionUtils.isEmpty(sellinRulesBySpec.get(spec.getId()))) {
// spec.getSpecRules().addAll(sellinRulesBySpec.get(spec.getId()));
// }
// if (!CollectionUtils.isEmpty(selloutRulesBySpec.get(spec.getId()))) {
// spec.getSpecRules().addAll(selloutRulesBySpec.get(spec.getId()));
// }
// });
return specs;
} }
public Boolean updateShopGoodsSpecState(Long shopId, Long goodsId, Long ruleId, Integer state) { public Boolean updateShopGoodsSpecState(Long shopId, Long goodsId, Long ruleId, Integer state) {
......
...@@ -2,6 +2,8 @@ package com.soss.system.utils; ...@@ -2,6 +2,8 @@ package com.soss.system.utils;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.soss.system.domain.po.LocationPo;
import com.soss.system.domain.vo.LocationVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -20,6 +22,7 @@ public class AreaUtil { ...@@ -20,6 +22,7 @@ public class AreaUtil {
// private Map<String, Area> areaMap; // private Map<String, Area> areaMap;
private Map<String, String> provNameMap = new HashMap<>(); private Map<String, String> provNameMap = new HashMap<>();
private Map<String, String> areaOrCityFullNameMap = new HashMap<>(); private Map<String, String> areaOrCityFullNameMap = new HashMap<>();
private static JSONArray DATA;
@PostConstruct @PostConstruct
public void init() { public void init() {
...@@ -27,15 +30,17 @@ public class AreaUtil { ...@@ -27,15 +30,17 @@ public class AreaUtil {
ClassPathResource resource = new ClassPathResource("province.json"); ClassPathResource resource = new ClassPathResource("province.json");
byte[] bdata = FileCopyUtils.copyToByteArray(resource.getInputStream()); byte[] bdata = FileCopyUtils.copyToByteArray(resource.getInputStream());
String data = new String(bdata, StandardCharsets.UTF_8); String data = new String(bdata, StandardCharsets.UTF_8);
JSONArray areaArray = JSONArray.parseArray(data); if (DATA == null) {
DATA = JSONArray.parseArray(data);
}
// areaMap = buildAreaTree(areaArray); // areaMap = buildAreaTree(areaArray);
deepAreaTree(areaArray, ""); deepAreaTree(DATA, "", 0);
} catch (IOException e) { } catch (IOException e) {
log.error("解析区域文件出错", e); log.error("解析区域文件出错", e);
} }
} }
private void deepAreaTree(JSONArray areaArray, String parentName) { private void deepAreaTree(JSONArray areaArray, String parentName, Integer deep) {
if (CollectionUtils.isEmpty(areaArray)) { if (CollectionUtils.isEmpty(areaArray)) {
return; return;
} }
...@@ -50,7 +55,7 @@ public class AreaUtil { ...@@ -50,7 +55,7 @@ public class AreaUtil {
areaOrCityFullNameMap.put(code, curLabel); areaOrCityFullNameMap.put(code, curLabel);
} }
JSONArray children = area.getJSONArray("children"); JSONArray children = area.getJSONArray("children");
deepAreaTree(children, curLabel); deepAreaTree(children, curLabel, deep + 1);
} }
} }
...@@ -62,6 +67,46 @@ public class AreaUtil { ...@@ -62,6 +67,46 @@ public class AreaUtil {
return areaOrCityFullNameMap.get(code); return areaOrCityFullNameMap.get(code);
} }
public LocationVo translateLocation(LocationPo locationPo) {
if (locationPo == null || locationPo.isEmpty()) {
return null;
}
for (int i = 0; i < DATA.size(); i++) {
JSONObject provinceObj = DATA.getJSONObject(i);
String provinceName = provinceObj.getString("label");
String provinceCode = provinceObj.getString("value");
if (!provinceName.equals(locationPo.getProvince())) {
continue;
}
JSONArray cityArray = provinceObj.getJSONArray("children");
for (int j = 0; j < cityArray.size(); j++) {
JSONObject cityObj = cityArray.getJSONObject(j);
String cityName = cityObj.getString("label");
String cityCode = cityObj.getString("value");
if (!cityName.equals(locationPo.getCity())) {
continue;
}
JSONArray areaArray = cityObj.getJSONArray("children");
for (int k = 0; k < areaArray.size(); k++) {
JSONObject areaObj = areaArray.getJSONObject(k);
String areaName = areaObj.getString("label");
String areaCode = areaObj.getString("value");
if (!areaName.equals(locationPo.getArea())) {
continue;
}
LocationVo locationVo = new LocationVo();
locationVo.setProvinceCode(provinceCode);
locationVo.setCityCode(cityCode);
locationVo.setAreaCode(areaCode);
return locationVo;
}
}
}
return null;
}
/*private Map<String, Area> buildAreaTree(JSONArray areaArray) { /*private Map<String, Area> buildAreaTree(JSONArray areaArray) {
if (CollectionUtils.isEmpty(areaArray)) { if (CollectionUtils.isEmpty(areaArray)) {
return null; return null;
......
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper <!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.soss.system.mapper.ShopMapper"> <mapper namespace="com.soss.system.mapper.ShopMapper">
<resultMap type="Shop" id="ShopResult"> <resultMap type="Shop" id="ShopResult">
<result property="id" column="id" /> <result property="id" column="id"/>
<result property="name" column="name" /> <result property="name" column="name"/>
<result property="code" column="code" /> <result property="code" column="code"/>
<result property="lng" column="lng" /> <result property="lng" column="lng"/>
<result property="lat" column="lat" /> <result property="lat" column="lat"/>
<result property="remarks" column="remarks" /> <result property="remarks" column="remarks"/>
<result property="startTime" column="start_time" /> <result property="startTime" column="start_time"/>
<result property="endTime" column="end_time" /> <result property="endTime" column="end_time"/>
<result property="address" column="address" /> <result property="address" column="address"/>
<result property="province" column="province" /> <result property="province" column="province"/>
<result property="city" column="city" /> <result property="city" column="city"/>
<result property="zone" column="zone"/> <result property="zone" column="zone"/>
<result property="distanceLimit" column="distance_limit"/> <result property="distanceLimit" column="distance_limit"/>
<result property="state" column="state"/> <result property="state" column="state"/>
...@@ -25,11 +25,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -25,11 +25,48 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectShopVo"> <sql id="selectShopVo">
select * from shop select *
from shop
</sql> </sql>
<select id="selectAllShop" resultMap="ShopResult"> <select id="selectAllShop" resultMap="ShopResult">
select id, name, code, province, city, zone from shop select id, name, code, province, city, zone
from shop
</select>
<select id="selectEnableShops" resultMap="ShopResult">
select * from shop s
<where>
<if test="states != null and states.size() > 0">
and s.state in
<foreach collection="states" item="state" separator="," open="(" close=")">#{state}</foreach>
</if>
</where>
</select>
<select id="selectDefaultSameLocationShops" resultMap="ShopResult">
select s1.* from shop s1 left join shop s2
on s1.province = s2.province and s1.city = s2.city and s1.`zone` = s2.`zone`
<where>
<if test="states != null and states.size() > 0">
and s1.state in
<foreach collection="states" item="state" separator="," open="(" close=")">#{state}</foreach>
</if>
and s2.is_default = 1
</where>
</select>
<select id="selectSameLocationShops" resultMap="ShopResult">
select s1.* from shop s1
<where>
<if test="states != null and states.size() > 0">
and s1.state in
<foreach collection="states" item="state" separator="," open="(" close=")">#{state}</foreach>
</if>
and s1.province = #{location.provinceCode}
and s1.city = #{location.cityCode}
and s1.`zone` = #{location.areaCode}
</where>
</select> </select>
<select id="selectShopList" parameterType="Shop" resultMap="ShopResult"> <select id="selectShopList" parameterType="Shop" resultMap="ShopResult">
...@@ -87,7 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -87,7 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createdAt != null">created_at,</if> <if test="createdAt != null">created_at,</if>
<if test="updatedAt != null">updated_at,</if> <if test="updatedAt != null">updated_at,</if>
<if test="isDefault != null">is_default,</if> <if test="isDefault != null">is_default,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null and name != ''">#{name},</if> <if test="name != null and name != ''">#{name},</if>
<if test="code != null and code != ''">#{code},</if> <if test="code != null and code != ''">#{code},</if>
...@@ -105,7 +142,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -105,7 +142,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createdAt != null">#{createdAt},</if> <if test="createdAt != null">#{createdAt},</if>
<if test="updatedAt != null">#{updatedAt},</if> <if test="updatedAt != null">#{updatedAt},</if>
<if test="isDefault != null">#{isDefault},</if> <if test="isDefault != null">#{isDefault},</if>
</trim> </trim>
</insert> </insert>
<update id="updateShop" parameterType="Shop"> <update id="updateShop" parameterType="Shop">
...@@ -131,16 +168,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -131,16 +168,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</update> </update>
<delete id="deleteShopById" parameterType="String"> <delete id="deleteShopById" parameterType="String">
delete from shop where id = #{id} delete
from shop
where id = #{id}
</delete> </delete>
<delete id="deleteShopByIds" parameterType="String"> <delete id="deleteShopByIds" parameterType="String">
delete from shop where id in delete from shop where id in
<foreach item="id" collection="array" open="(" separator="," close=")"> <foreach item="id" collection="array" open="(" separator="," close=")">
#{id} #{id}
</foreach> </foreach>
</delete> </delete>
<update id="updateNoDefault"> <update id="updateNoDefault">
update shop set is_default = 0 update shop
set is_default = 0
</update> </update>
</mapper> </mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment