Api/src/main/java/com/java110/api/listener/complaint/SaveComplaintListener.java
@@ -37,7 +37,7 @@ protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) { //Assert.hasKeyAndValue(reqJson, "xxx", "xxx"); /*Assert.hasKeyAndValue(reqJson, "storeId", "必填,请填写商户ID");*/ Assert.hasKeyAndValue(reqJson, "storeId", "必填,请填写商户ID"); Assert.hasKeyAndValue(reqJson, "typeCd", "必填,请选择投诉类型"); Assert.hasKeyAndValue(reqJson, "roomId", "必填,请选择房屋编号"); Assert.hasKeyAndValue(reqJson, "complaintName", "必填,请填写投诉人"); Api/src/main/java/com/java110/api/listener/parkingSpace/QueryParkingSpacesByOwnerListener.java
@@ -89,7 +89,8 @@ List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto); if (parkingSpaceDtos == null || parkingSpaceDtos.size() != 1) { throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "根据psId 查询存在多条停车位信息" + tmpOwnerCarDto.getPsId()); //throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "根据psId 查询存在多条停车位信息" + tmpOwnerCarDto.getPsId()); continue; } parkingSpaceDto = parkingSpaceDtos.get(0); Api/src/main/java/com/java110/api/listener/store/ListStoresByCommunityListener.java
New file @@ -0,0 +1,112 @@ package com.java110.api.listener.store; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.api.listener.AbstractServiceApiDataFlowListener; import com.java110.api.listener.AbstractServiceApiListener; import com.java110.core.annotation.Java110Listener; import com.java110.core.context.DataFlowContext; import com.java110.core.factory.DataFlowFactory; import com.java110.core.factory.GenerateCodeFactory; import com.java110.core.smo.community.ICommunityInnerServiceSMO; import com.java110.core.smo.store.IStoreInnerServiceSMO; import com.java110.dto.CommunityMemberDto; import com.java110.dto.store.StoreDto; import com.java110.entity.center.AppService; import com.java110.event.service.api.ServiceDataFlowEvent; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.*; import com.java110.utils.util.Assert; import com.java110.utils.util.BeanConvertUtil; import com.java110.vo.api.advert.ApiAdvertDataVo; import com.java110.vo.api.advert.ApiAdvertVo; import com.java110.vo.api.store.ApiStoreDataVo; import com.java110.vo.api.store.ApiStoreVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import java.util.ArrayList; import java.util.List; /** * 保存商户信息 * Created by Administrator on 2019/3/29. */ @Java110Listener("listStoresByCommunityListener") public class ListStoresByCommunityListener extends AbstractServiceApiListener { @Autowired private ICommunityInnerServiceSMO communityInnerServiceSMOImpl; @Autowired private IStoreInnerServiceSMO storeInnerServiceSMOImpl; @Override public int getOrder() { return 0; } @Override public String getServiceCode() { return ServiceCodeConstant.SERVICE_CODE_LIST_STORES_BY_COMMUNITY; } @Override public HttpMethod getHttpMethod() { return HttpMethod.POST; } @Override protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) { super.validatePageInfo(reqJson); Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区信息"); } @Override protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) { CommunityMemberDto communityMemberDto = BeanConvertUtil.covertBean(reqJson, CommunityMemberDto.class); int storeCount = communityInnerServiceSMOImpl.getCommunityMemberCount(communityMemberDto); List<CommunityMemberDto> communityMemberDtos = null; List<ApiStoreDataVo> stores = null; if (storeCount > 0) { communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto); StoreDto storeDto = new StoreDto(); storeDto.setStoreIds(getStoreIds(communityMemberDtos)); List<StoreDto> storeDtos = storeInnerServiceSMOImpl.getStores(storeDto); stores = BeanConvertUtil.covertBeanList(storeDtos, ApiStoreDataVo.class); } else { stores = new ArrayList<>(); } ApiStoreVo apiStoreVo = new ApiStoreVo(); apiStoreVo.setTotal(storeCount); apiStoreVo.setRecords((int) Math.ceil((double) storeCount / (double) reqJson.getInteger("row"))); apiStoreVo.setStores(stores); ResponseEntity<String> responseEntity = new ResponseEntity<String>(JSONObject.toJSONString(apiStoreVo), HttpStatus.OK); context.setResponseEntity(responseEntity); } /** * 查询商户ID * * @param communityMemberDtos * @return */ private String[] getStoreIds(List<CommunityMemberDto> communityMemberDtos) { List<String> storeIds = new ArrayList<>(); for (CommunityMemberDto communityMemberDto : communityMemberDtos) { storeIds.add(communityMemberDto.getMemberId()); } return storeIds.toArray(new String[storeIds.size()]); } } AppFrontService/src/main/java/com/java110/app/controller/ComplaintController.java
@@ -1,10 +1,12 @@ package com.java110.app.controller; import com.alibaba.fastjson.JSONObject; import com.java110.app.smo.complaint.ISaveComplaintSMO; import com.java110.app.smo.wxLogin.IWxLoginSMO; import com.java110.core.base.controller.BaseController; import com.java110.core.context.IPageData; import com.java110.core.context.PageData; import com.java110.utils.constant.CommonConstant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +28,7 @@ private final static Logger logger = LoggerFactory.getLogger(ComplaintController.class); @Autowired private IWxLoginSMO wxLoginSMOImpl; private ISaveComplaintSMO saveComplaintSMOImpl; /** @@ -38,7 +40,11 @@ @RequestMapping(path = "/complaint", method = RequestMethod.POST) public ResponseEntity<String> complaint(@RequestBody String postInfo, HttpServletRequest request) { return wxLoginSMOImpl.doLogin(null); /*IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);*/ IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA); return saveComplaintSMOImpl.save(pd); } } AppFrontService/src/main/java/com/java110/app/controller/PaymentController.java
New file @@ -0,0 +1,51 @@ package com.java110.app.controller; import com.java110.app.smo.complaint.ISaveComplaintSMO; import com.java110.core.base.controller.BaseController; import com.java110.core.context.IPageData; import com.java110.utils.constant.CommonConstant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; /** * 支付 处理类 */ @RestController @RequestMapping(path = "/app/payment") public class PaymentController extends BaseController { private final static Logger logger = LoggerFactory.getLogger(PaymentController.class); /** * <p>统一下单入口</p> * * @param request * @throws Exception */ @RequestMapping(path = "/toPay", method = RequestMethod.POST) public ResponseEntity<String> toPay(@RequestBody String postInfo, HttpServletRequest request) { return null; } /** * <p>支付回调Api</p> * * @param request * @throws Exception */ @RequestMapping(path = "/notify", method = RequestMethod.POST) public ResponseEntity<String> notify(@RequestBody String postInfo, HttpServletRequest request) { return null; } } AppFrontService/src/main/java/com/java110/app/smo/complaint/impl/SaveComplaintSMOImpl.java
@@ -1,26 +1,68 @@ package com.java110.app.smo.complaint.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.app.smo.AppAbstractComponentSMO; import com.java110.app.smo.complaint.ISaveComplaintSMO; import com.java110.app.smo.wxLogin.impl.WxLoginSMOImpl; import com.java110.core.context.IPageData; import com.java110.utils.constant.ServiceConstant; import com.java110.utils.util.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Service("saveComplaintSMOImpl") public class SaveComplaintSMOImpl extends AppAbstractComponentSMO implements ISaveComplaintSMO { private final static Logger logger = LoggerFactory.getLogger(SaveComplaintSMOImpl.class); @Autowired private RestTemplate restTemplate; @Override public ResponseEntity<String> save(IPageData pd) { return null; return businessProcess(pd); } @Override protected void validate(IPageData pd, JSONObject paramIn) { Assert.hasKeyAndValue(paramIn, "communityId", "请求报文中未包含小区信息"); } @Override protected ResponseEntity<String> doBusinessProcess(IPageData pd, JSONObject paramIn) throws IOException { return null; //查询用户ID paramIn.put("userId", pd.getUserId()); //查询商户ID Map paramObj = new HashMap(); paramObj.put("communityId", paramIn.getString("communityId")); paramObj.put("auditStatusCd", "1100"); paramObj.put("memberTypeCd", "390001200002"); paramObj.put("page", 1); paramObj.put("row", 1); String url = ServiceConstant.SERVICE_API_URL + "/api/store.listStoresByCommunity" + mapToUrlParam(paramObj); ResponseEntity<String> responseEntity = super.callCenterService(restTemplate, pd, "", url, HttpMethod.GET); if (responseEntity.getStatusCode() != HttpStatus.OK) { return responseEntity; } JSONObject storeObj = JSONObject.parseObject(responseEntity.getBody()); JSONArray stores = storeObj.getJSONArray("stores"); String storeId = stores.getJSONObject(0).getString("storeId"); paramIn.put("storeId", storeId); url = ServiceConstant.SERVICE_API_URL + "/api/complaint.saveComplaint"; responseEntity = super.callCenterService(restTemplate, pd, paramIn.toJSONString(), url, HttpMethod.POST); return responseEntity; } } AppFrontService/src/main/java/com/java110/app/smo/payment/IToPaySMO.java
New file @@ -0,0 +1,17 @@ package com.java110.app.smo.payment; import com.java110.core.context.IPageData; import org.springframework.http.ResponseEntity; /** * 统一下单接口类 */ public interface IToPaySMO { /** * 下单 * @param pd * @return */ public ResponseEntity<String> toPay(IPageData pd); } AppFrontService/src/main/java/com/java110/app/smo/payment/impl/ToPaySMOImpl.java
New file @@ -0,0 +1,26 @@ package com.java110.app.smo.payment.impl; import com.alibaba.fastjson.JSONObject; import com.java110.app.smo.AppAbstractComponentSMO; import com.java110.app.smo.payment.IToPaySMO; import com.java110.core.context.IPageData; import org.springframework.http.ResponseEntity; import java.io.IOException; public class ToPaySMOImpl extends AppAbstractComponentSMO implements IToPaySMO { @Override public ResponseEntity<String> toPay(IPageData pd) { return super.businessProcess(pd); } @Override protected void validate(IPageData pd, JSONObject paramIn) { } @Override protected ResponseEntity<String> doBusinessProcess(IPageData pd, JSONObject paramIn) throws IOException { return null; } } java110-bean/src/main/java/com/java110/dto/store/StoreDto.java
@@ -17,6 +17,7 @@ private String storeId; private String[] storeIds; private String userId; private String name; private String address; @@ -136,4 +137,12 @@ public void setStoreTypeName(String storeTypeName) { this.storeTypeName = storeTypeName; } public String[] getStoreIds() { return storeIds; } public void setStoreIds(String[] storeIds) { this.storeIds = storeIds; } } java110-bean/src/main/java/com/java110/vo/api/store/ApiStoreDataVo.java
New file @@ -0,0 +1,115 @@ package com.java110.vo.api.store; import java.io.Serializable; import java.util.Date; public class ApiStoreDataVo implements Serializable { private String storeId; private String userId; private String name; private String address; private String tel; private String storeTypeCd; private String nearByLandmarks; private String mapX; private String mapY; private String storeName; private String storeTypeName; private String createTime; public String getStoreId() { return storeId; } public void setStoreId(String storeId) { this.storeId = storeId; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getStoreTypeCd() { return storeTypeCd; } public void setStoreTypeCd(String storeTypeCd) { this.storeTypeCd = storeTypeCd; } public String getNearByLandmarks() { return nearByLandmarks; } public void setNearByLandmarks(String nearByLandmarks) { this.nearByLandmarks = nearByLandmarks; } public String getMapX() { return mapX; } public void setMapX(String mapX) { this.mapX = mapX; } public String getMapY() { return mapY; } public void setMapY(String mapY) { this.mapY = mapY; } public String getStoreName() { return storeName; } public void setStoreName(String storeName) { this.storeName = storeName; } public String getStoreTypeName() { return storeTypeName; } public void setStoreTypeName(String storeTypeName) { this.storeTypeName = storeTypeName; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } } java110-bean/src/main/java/com/java110/vo/api/store/ApiStoreVo.java
New file @@ -0,0 +1,19 @@ package com.java110.vo.api.store; import com.java110.vo.MorePageVo; import java.io.Serializable; import java.util.List; public class ApiStoreVo extends MorePageVo implements Serializable { List<ApiStoreDataVo> stores; public List<ApiStoreDataVo> getStores() { return stores; } public void setStores(List<ApiStoreDataVo> stores) { this.stores = stores; } } java110-core/src/main/java/com/java110/core/factory/PaymentFactory.java
New file @@ -0,0 +1,338 @@ package com.java110.core.factory; import com.alibaba.fastjson.JSONObject; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.springframework.util.StringUtils; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.servlet.http.HttpServletRequest; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.StringWriter; import java.math.BigDecimal; import java.net.InetAddress; import java.text.SimpleDateFormat; import java.util.*; /** * Function: 支付工厂类 <br/> * date: 2018-01-18 <br/> * * @author att * @version 1.0 * @see * @since JDK1.8 */ public class PaymentFactory { static Logger log = LogManager.getLogger(PaymentFactory.class); /** * 获取当前机器的ip * * @return String */ public static String getLocalIp() { InetAddress ia = null; String localip = null; try { ia = ia.getLocalHost(); localip = ia.getHostAddress(); } catch (Exception e) { e.printStackTrace(); } return localip; } /** * Map转换为 Xml * * @return Xml * @throws Exception */ public static String mapToXml(SortedMap<String, String> map) throws Exception { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //防止XXE攻击 documentBuilderFactory.setXIncludeAware(false); documentBuilderFactory.setExpandEntityReferences(false); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); org.w3c.dom.Document document = documentBuilder.newDocument(); org.w3c.dom.Element root = document.createElement("xml"); document.appendChild(root); for (String key : map.keySet()) { String value = map.get(key); if (value == null) { value = ""; } value = value.trim(); org.w3c.dom.Element filed = document.createElement(key); filed.appendChild(document.createTextNode(value)); root.appendChild(filed); } TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); DOMSource source = new DOMSource(document); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer); transformer.transform(source, result); String output = writer.getBuffer().toString(); try { writer.close(); } catch (Exception ex) { } return output; } /** * 创建签名Sign * * @param key * @param parameters * @return */ public static String createSign(SortedMap<String, String> parameters, String key) { StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet(); Iterator<?> it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); if (entry.getValue() != null || !"".equals(entry.getValue())) { String v = String.valueOf(entry.getValue()); if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { sb.append(k + "=" + v + "&"); } } } sb.append("key=" + key); String sign = AuthenticationFactory.md5(sb.toString()).toUpperCase(); return sign; } /** * XML转换为Map * * @param strXML * @return Map * @throws Exception */ public static Map<String, Object> getMapFromXML(String strXML) throws Exception { try { Map<String, Object> data = new HashMap<String, Object>(); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //防止XXE攻击 documentBuilderFactory.setXIncludeAware(false); documentBuilderFactory.setExpandEntityReferences(false); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8")); org.w3c.dom.Document doc = documentBuilder.parse(stream); doc.getDocumentElement().normalize(); NodeList nodeList = doc.getDocumentElement().getChildNodes(); for (int idx = 0; idx < nodeList.getLength(); ++idx) { Node node = nodeList.item(idx); if (node.getNodeType() == Node.ELEMENT_NODE) { org.w3c.dom.Element element = (org.w3c.dom.Element) node; data.put(element.getNodeName(), element.getTextContent()); } } try { stream.close(); } catch (Exception ex) { ex.printStackTrace(); } return data; } catch (Exception ex) { throw ex; } } /** * 生成随机数 * * @return */ public static String makeUUID(int len) { return UUID.randomUUID().toString().replaceAll("-", "").substring(0, len); } /** * 获取当前的Timestamp * * @return */ public static String getCurrentTimeStamp() { return Long.toString(System.currentTimeMillis() / 1000); } /** * 获取当前的时间 * * @return */ public static long getCurrentTimestampMs() { return System.currentTimeMillis(); } /** * 生成订单号 * * @return */ public static String generateOrderNo() { SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); return sdf.format(new Date()) + makeUUID(16); } /** * 获取当前工程url * * @param request * @return */ public static String getCurrentUrl(HttpServletRequest request) { return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); } /** * Xml字符串转换为Map * * @param xmlStr * @return */ public static Map<String, String> xmlStrToMap(String xmlStr) { Map<String, String> map = new HashMap<String, String>(); Document doc; try { doc = DocumentHelper.parseText(xmlStr); Element root = doc.getRootElement(); List children = root.elements(); if (children != null && children.size() > 0) { for (int i = 0; i < children.size(); i++) { Element child = (Element) children.get(i); map.put(child.getName(), child.getTextTrim()); } } } catch (DocumentException e) { e.printStackTrace(); } return map; } public static String getSceneInfo(String wapUrl, String name) { Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>(); if (!StringUtils.isEmpty(wapUrl) && !StringUtils.isEmpty(name)) { /*{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}}*/ Map<String, String> childmap = new TreeMap<String, String>(); childmap.put("type", "Wap"); childmap.put("wap_url", wapUrl); childmap.put("wap_name", name); map.put("h5_info", childmap); return JSONObject.toJSONString(map); } return null; } /** * 转换金额型到整型 * * @param money * @return */ public static String moneyToIntegerStr(Double money) { BigDecimal decimal = new BigDecimal(money); int amount = decimal.multiply(new BigDecimal(100)) .setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); return String.valueOf(amount); } /** * 除去数组中的空值和签名参数 * * @param sArray 签名参数组 * @return 去掉空值与签名参数后的新签名参数组 */ public static Map<String, String> paraFilter(Map<String, String> sArray) { Map<String, String> result = new HashMap<String, String>(); if (sArray == null || sArray.size() <= 0) { return result; } for (String key : sArray.keySet()) { String value = sArray.get(key); if (value == null || value.equals("") || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("sign_type")) { continue; } result.put(key, value); } return result; } /** * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串 * * @param params 需要排序并参与字符拼接的参数组 * @return 拼接后字符串 */ public static String createLinkString(Map<String, String> params) { List<String> keys = new ArrayList<String>(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = params.get(key); if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符 prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; } /** * 根据不同环境生成支付金额 * * @param env * @param money * @return */ public static double getPayAmountByEnv(String env, Double money) { double pay_money = 0.01; //测试环境 if ("ON".equals(env)) { if (money > 10000) { pay_money = 0.03; } else if (money > 1000) { pay_money = 0.02; } else { pay_money = 0.01; } return pay_money; } else { //生成环境 return money; } } } java110-utils/src/main/java/com/java110/utils/constant/ServiceCodeConstant.java
@@ -128,6 +128,11 @@ public static final String SERVICE_CODE_SAVE_STORE_INFO = "save.store.info"; /** * 保存商户信息 */ public static final String SERVICE_CODE_LIST_STORES_BY_COMMUNITY = "store.listStoresByCommunity"; /** * 修改商户信息 */ public static final String SERVICE_CODE_UPDATE_STORE_INFO = "update.store.info";