diff --git a/play-admin/pom.xml b/play-admin/pom.xml index 89aeefd..b117866 100644 --- a/play-admin/pom.xml +++ b/play-admin/pom.xml @@ -93,17 +93,10 @@ com.github.binarywang wx-java-mp-spring-boot-starter - - - com.github.binarywang - weixin-java-pay - - - - - - + com.github.wxpay + wxpay-sdk + 0.0.3 @@ -129,9 +122,14 @@ com.tencentcloudapi tencentcloud-sdk-java-dnspod 3.1.322 + + + okio + com.squareup.okio + + - diff --git a/play-admin/src/main/java/com/starry/admin/Application.java b/play-admin/src/main/java/com/starry/admin/Application.java index ec6c3c9..4c6bdfd 100644 --- a/play-admin/src/main/java/com/starry/admin/Application.java +++ b/play-admin/src/main/java/com/starry/admin/Application.java @@ -14,5 +14,4 @@ public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } - } diff --git a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java index d7d5a5e..4e36f5f 100644 --- a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java +++ b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java @@ -11,6 +11,8 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.time.LocalDateTime; +import java.time.ZoneId; import java.util.Date; /** @@ -32,7 +34,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill ...."); - this.setFieldValByName("createdTime", new Date(), metaObject); +// this.setFieldValByName("createdTime", getDate(), metaObject); this.setFieldValByName("deleted", false, metaObject); this.setFieldValByName("version", 1L, metaObject); Object createUser = this.getFieldValByName("createdBy", metaObject); @@ -46,13 +48,20 @@ public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); - this.setFieldValByName("updatedTime", new Date(), metaObject); +// this.setFieldValByName("updatedTime", getDate(), metaObject); Object createUser = this.getFieldValByName("updatedBy", metaObject); if (createUser == null) { this.setFieldValByName("createdBy", getOperatorId(), metaObject); } } + public Date getDate() { + + LocalDateTime localDateTime = LocalDateTime.now(); + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); +// return Date.from(localDateTime.toInstant(ZoneOffset.ofHours(8))); + } + public String getOperatorId() { if (request.getServletPath().startsWith("/wx/")) { String tenantKey = request.getHeader("tenantkey"); diff --git a/play-admin/src/main/java/com/starry/admin/common/oss/OssProperties.java b/play-admin/src/main/java/com/starry/admin/common/oss/OssProperties.java index 64953ad..91372e2 100644 --- a/play-admin/src/main/java/com/starry/admin/common/oss/OssProperties.java +++ b/play-admin/src/main/java/com/starry/admin/common/oss/OssProperties.java @@ -22,7 +22,7 @@ public class OssProperties implements InitializingBean { public String bucketName; @Override - public void afterPropertiesSet() throws Exception { + public void afterPropertiesSet() { ENDPOINT = getEndpoint(); KEY_ID = getAccessKeyId(); KEY_SECRET = getAccessKeySecret(); diff --git a/play-admin/src/main/java/com/starry/admin/common/play/wx/CommonText.java b/play-admin/src/main/java/com/starry/admin/common/play/wx/CommonText.java new file mode 100644 index 0000000..31da476 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/play/wx/CommonText.java @@ -0,0 +1,38 @@ +package com.starry.admin.common.play.wx; + +public class CommonText { + + public static final String DATA_NOT_EXIST = "数据不存在"; + + /** + * 微信公众号 + */ + public static final String WECHAT_CONFIG_DOES_NOT_EXIST = "未配置公司微信公众号的相关信息"; + public static final String WECHAT_PAY_CONFIG_DOES_NOT_EXIST = "未配置公司微信支付的相关信息"; + public static final String OPENID_DOES_NOT_EXIST = "请上传微信用户openid"; + public static final String WECHAT_TRADE_TYPE_DOES_NOT_EXIST = "请上传微信支付交易类型"; + public static final String OPENID_ALREADY_BIND = "该微信号已被其他账号绑定!"; + public static final String ADMIN_OPENID_DOES_NOT_EXIST = "请上传管理员openid"; + public static final String OPENID_DOES_NOT_FIND = "未获取到对应微信用户openid"; + public static final String WECHAT_CODE_DOES_NOT_EXIST = "请上传微信用户code"; + public static final String WECHAT_USER_TOKEN_DOES_ERR = "获取微信用户token失败"; + public static final String UNIFIEDORDER_ERR = "统一下单失败"; + public static final String UNIFIEDORDER_ERR_PREPAY_ID_NOT_FIND = "统一下单失败,未生成PREPAY_ID"; + + /** + * 微信小程序 + */ + public static final String MINI_OPENID_DOES_NOT_EXIST = "请上传小程序用户openid"; + public static final String WECHAT_MINI_CONFIG_DOES_NOT_EXIST = "未配置公司微信小程序的相关信息"; + public static final String WECHAT_MINI_PARAM_NOT_EXIST = "缺少所需小程序参数!"; + public static final String WECHAT_MINI_IV_NOT_EXIST = "请上传iv参数"; + public static final String WECHAT_MINI_SESSION_KEY_DOES_NOT_EXIST = "请上传session_key参数"; + public static final String WECHAT_MINI_ENCRYPTED_DATA_DOES_NOT_EXIST = "请上传encrypted_data参数"; + public static final String WECHAT_MINI_ENCRYPTED_DATA_PARSE_ERR = "encrypted_data解析失败"; + public static final String WECHAT_MINI_ENCRYPTED_DATA_NOT_HAVE_PHONE_NUM = "encrypted_data中未解析出电话号码"; + + /** + * 支付相关 + */ + public static final String ORDER_PAY_TYPE_NOT_EXIST = "请上传支付方式!"; +} diff --git a/play-admin/src/main/java/com/starry/admin/common/play/wx/HttpUtils.java b/play-admin/src/main/java/com/starry/admin/common/play/wx/HttpUtils.java new file mode 100644 index 0000000..d9cbf9b --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/play/wx/HttpUtils.java @@ -0,0 +1,199 @@ +package com.starry.admin.common.play.wx; + +import com.alibaba.fastjson2.JSONObject; +import com.starry.admin.common.exception.CustomException; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.util.EntityUtils; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import java.io.*; +import java.net.ConnectException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.KeyStore; + +@Slf4j +public class HttpUtils { + + public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) { + StringBuilder buffer = new StringBuilder(); + try { + // 创建SSLContext对象,并使用我们指定的信任管理器初始化 + TrustManager[] tm = {new MyX509TrustManager()}; + SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); + sslContext.init(null, tm, new java.security.SecureRandom()); + // 从上述SSLContext对象中得到SSLSocketFactory对象 + SSLSocketFactory ssf = sslContext.getSocketFactory(); + + URL url = new URL(requestUrl); + HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(); + httpUrlConn.setSSLSocketFactory(ssf); + httpUrlConn.setDoOutput(true); + httpUrlConn.setDoInput(true); + httpUrlConn.setUseCaches(false); + // 设置请求方式(GET/POST) + httpUrlConn.setRequestMethod(requestMethod); + if ("GET".equalsIgnoreCase(requestMethod)) httpUrlConn.connect(); + // 当有数据需要提交时 + if (null != outputStr) { + OutputStream outputStream = httpUrlConn.getOutputStream(); + // 注意编码格式,防止中文乱码 + outputStream.write(outputStr.getBytes(StandardCharsets.UTF_8)); + outputStream.close(); + } + // 将返回的输入流转换成字符串 + InputStream inputStream = httpUrlConn.getInputStream(); + InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + + String str; + while ((str = bufferedReader.readLine()) != null) { + buffer.append(str); + } + bufferedReader.close(); + inputStreamReader.close(); + // 释放资源 + inputStream.close(); + httpUrlConn.disconnect(); + return JSONObject.parseObject(buffer.toString()); + } catch (ConnectException ce) { + log.error("weixin server connection timed out"); + } catch (Exception e) { + log.error("weixin play error", e); + } + return null; + } + +// /** +// * 向指定 URL 发送POST方法的请求 +// * +// * @param url 发送请求的 URL +// * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 +// * @return 所代表远程资源的响应结果 +// */ +// public static String sendPost(String url, String param) { +// URLConnection conn = getConnection(url); +// StringBuilder result = new StringBuilder(); +// try (PrintWriter out = new PrintWriter(conn.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { +// out.print(param); +// out.flush(); +// String line; +// while ((line = in.readLine()) != null) { +// result.append(line); +// } +// } catch (Exception e) { +// log.error("sendPost error", e); +// } +// return result.toString(); +// } + + + public static String sendPost(String requestUrl, String outputStr) throws IOException { + HttpURLConnection conn = getConnection(requestUrl); + // 当outputStr不为null时向输出流写数据 + if (null != outputStr) { + OutputStream outputStream = conn.getOutputStream(); + // 注意编码格式 + outputStream.write(outputStr.getBytes(StandardCharsets.UTF_8)); + outputStream.close(); + } + + try (InputStream inputStream = conn.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { + // 从输入流读取返回内容 + String str; + StringBuilder buffer = new StringBuilder(); + while ((str = bufferedReader.readLine()) != null) { + buffer.append(str); + } + // 释放资源 + conn.disconnect(); + return buffer.toString(); + } catch (Exception e) { + log.error("sendPost error,url = {},outputStr={}", requestUrl, outputStr, e); + } + return null; + } + + + /** + * 需要使用证书请求接口 + */ + public static String requestWithCert(String url, String pay_cert, String mchid, String data) throws Exception { + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + try (FileInputStream is = new FileInputStream(pay_cert)) { + // 这里写密码..默认是你的MCHID + keyStore.load(is, mchid.toCharArray()); + } + // Trust own CA and all self-signed certs + SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchid.toCharArray())// 这里也是写密码的 + .build(); + // Allow TLSv1 protocol only + SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); + try (CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(socketFactory).build()) { + HttpPost httpPost = getHttpPost(url, data); + try (CloseableHttpResponse response = httpclient.execute(httpPost)) { + HttpEntity entity = response.getEntity(); + String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); + EntityUtils.consume(entity); + return jsonStr; + } + } + } + + private static HttpPost getHttpPost(String url, String data) { + HttpPost httpPost = new HttpPost(url); // 设置响应头信息 + httpPost.addHeader("Connection", "keep-alive"); + httpPost.addHeader("Accept", "*/*"); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + httpPost.addHeader("Host", "api.mch.weixin.qq.com"); + httpPost.addHeader("X-Requested-With", "XMLHttpRequest"); + httpPost.addHeader("Cache-Control", "max-age=0"); + httpPost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); + httpPost.setEntity(new StringEntity(data, "UTF-8")); + return httpPost; + } + + + /** + * 获取网络连接 + * + * @param url URL + * @return URLConnection + */ + private static HttpURLConnection getConnection(String url) { + try { + URL realUrl = new URL(url); + // 打开和URL之间的连接 + URLConnection conn = realUrl.openConnection(); + // 设置通用的请求属性 + conn.setRequestProperty("Charset", "UTF-8"); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + // 发送POST请求必须设置如下两行 + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); + return (HttpURLConnection) conn; + } catch (IOException e) { + log.error("getConnection error", e); + throw new CustomException("getConnection error," + e.getMessage()); + } + + } + + +} diff --git a/play-admin/src/main/java/com/starry/admin/common/play/wx/MyX509TrustManager.java b/play-admin/src/main/java/com/starry/admin/common/play/wx/MyX509TrustManager.java new file mode 100644 index 0000000..10d43b5 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/play/wx/MyX509TrustManager.java @@ -0,0 +1,28 @@ +package com.starry.admin.common.play.wx; + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + + +/** + * 对于https请求,我们需要一个证书信任管理器,这个管理器类需要自己定义,但需要实现X509TrustManager接口 + * 证书信任管理器(用于https请求) + * 这个证书管理器的作用就是让它信任我们指定的证书,上面的代码意味着信任所有证书,不管是否权威机构颁发。 + * + * @author jiangyin + */ +public class MyX509TrustManager implements X509TrustManager { + + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + +} diff --git a/play-admin/src/main/java/com/starry/admin/common/play/wx/WXPayXmlUtil.java b/play-admin/src/main/java/com/starry/admin/common/play/wx/WXPayXmlUtil.java new file mode 100644 index 0000000..6e7c705 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/play/wx/WXPayXmlUtil.java @@ -0,0 +1,27 @@ +package com.starry.admin.common.play.wx; + +import org.w3c.dom.Document; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +public final class WXPayXmlUtil { + public static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); + documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + documentBuilderFactory.setXIncludeAware(false); + documentBuilderFactory.setExpandEntityReferences(false); + + return documentBuilderFactory.newDocumentBuilder(); + } + + public static Document newDocument() throws ParserConfigurationException { + return newDocumentBuilder().newDocument(); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/common/play/wx/WeChatConstants.java b/play-admin/src/main/java/com/starry/admin/common/play/wx/WeChatConstants.java new file mode 100644 index 0000000..710a4d2 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/play/wx/WeChatConstants.java @@ -0,0 +1,45 @@ +package com.starry.admin.common.play.wx; + +public class WeChatConstants { + + public enum SignType { + MD5, HMACSHA256 + } + + public static final String FIELD_SIGN = "sign"; + + /** + * 支付成功回调地址 + */ + public static String NOTIFY_URL = "http://8.142.116.233:8001/pay/wxpay/callback"; + + + /** + * 支付证书路径 + */ + public static String PAY_CERT_LOC = "C:\\CTO\\java\\apache-tomcat-8.0.50\\wxcert\\"; + + /** + * 微信 trade_type 参数 + */ + public static final String TRADE_TYPE_JSAPI = "JSAPI";//JSAPI支付 例如 : 直接调用微信支付 + public static final String TRADE_TYPE_NATIVE = "NATIVE";//Native支付 例如 : 扫码支付 + + /** + * 统一下单 + */ + public static String UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"; + /** + * 订单支付状态查询 + */ + public static String ORDERQUERY_URL = "https://api.mch.weixin.qq.com/pay/orderquery"; + /** + * 退款 + */ + public static String REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund"; + /** + * 提现 + */ + public static String TRANSFERS_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; + +} \ No newline at end of file diff --git a/play-admin/src/main/java/com/starry/admin/common/play/wx/WxPlayProperties.java b/play-admin/src/main/java/com/starry/admin/common/play/wx/WxPlayProperties.java new file mode 100644 index 0000000..5554f4b --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/play/wx/WxPlayProperties.java @@ -0,0 +1,69 @@ +package com.starry.admin.common.play.wx; + +import lombok.Data; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +@Data +@Configuration +@ConfigurationProperties(prefix = "wx.play") +@PropertySource(value = {"classpath:play.properties"}) +public class WxPlayProperties implements InitializingBean { + + /** + * 设置微信公众号或者小程序等的appid + */ + private String appId; + /** + * 微信支付商户号 + */ + private String mchId; + + /** + * 证书相对路径 + */ + private String privateKeyPath; + + /** + * 证书相对路径 + */ + private String privateCertPath; + + /** + * 下单回调地址 + */ + private String returnUrl; + + /** + * 退款回调地址 + */ + private String refundUrl; + + + /** + * apiV3key + */ + private String apiV3key; + + + public static String APP_ID = ""; + public static String MCH_ID = ""; + public static String PRIVATE_KEY_PATH = ""; + public static String PRIVATE_CERT_PATH = ""; + public static String RETURN_URL = ""; + public static String REFUND_URL = ""; + public static String API_V3KEY = ""; + + @Override + public void afterPropertiesSet() { + APP_ID = getAppId(); + MCH_ID = getMchId(); + PRIVATE_KEY_PATH = getPrivateKeyPath(); + PRIVATE_CERT_PATH = getPrivateCertPath(); + RETURN_URL = getReturnUrl(); + REFUND_URL = getRefundUrl(); + API_V3KEY = getApiV3key(); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/common/play/wx/WxPlayUtils.java b/play-admin/src/main/java/com/starry/admin/common/play/wx/WxPlayUtils.java new file mode 100644 index 0000000..cf446ff --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/play/wx/WxPlayUtils.java @@ -0,0 +1,354 @@ +package com.starry.admin.common.play.wx; + +import cn.hutool.core.util.IdUtil; +import com.github.wxpay.sdk.WXPayUtil; +import com.starry.admin.common.exception.CustomException; +import lombok.extern.slf4j.Slf4j; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import javax.xml.parsers.DocumentBuilder; +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.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.*; + +@Slf4j +public class WxPlayUtils { + + private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + private static final Random RANDOM = new SecureRandom(); + + + /** + * @param openId 微信公众号ID + * @param appid 用户ID + * @param mchId 商户ID + * @param orderId 订单ID + * @param spBillCreateIp 终端设备ID + * @param body 商品描述 + * @param totalFee 商品金额 + * @param attach 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用(传入租户ID) + * @return + * @throws Exception + */ + public static String unifiedOrderJSAPI(String openId, String appid, String mchId, String orderId, String spBillCreateIp, String body, String attach, int totalFee) throws Exception { + Map playRequestParameters = new HashMap<>(); + playRequestParameters.put("appid", appid); + playRequestParameters.put("mch_id", mchId); + playRequestParameters.put("nonce_str", IdUtil.fastSimpleUUID()); + playRequestParameters.put("body", body); + playRequestParameters.put("attach", attach); + playRequestParameters.put("out_trade_no", orderId); + playRequestParameters.put("total_fee", String.valueOf(totalFee)); + playRequestParameters.put("spbill_create_ip", spBillCreateIp); + playRequestParameters.put("notify_url", WxPlayProperties.RETURN_URL); + playRequestParameters.put("trade_type", "JSAPI"); + playRequestParameters.put("openId", openId); + String nonce_str = IdUtil.fastSimpleUUID(); + //生成签名, 统一下单 + log.debug("paraMap------------{}", playRequestParameters); + String sign = WXPayUtil.generateSignature(playRequestParameters, orderId); + log.debug("sign:{}", sign); + playRequestParameters.put("sign", sign); + String xml = WXPayUtil.mapToXml(playRequestParameters);//将所有参数(map)转xml格式 + String new_xml = new String(xml.getBytes(StandardCharsets.UTF_8)); + log.debug("xml:{}", new_xml); + //发送post请求"统一下单接口"返回预支付id:prepay_id + String xmlStr = HttpUtils.sendPost(WeChatConstants.UNIFIEDORDER_URL, generateSignedXml(playRequestParameters, orderId)); +// String xmlStr = HttpUtils.sendPost(WeChatConstants.UNIFIEDORDER_URL, generateSignedXml(playRequestParameters, orderId)); + log.debug("xmlStr:{}", xmlStr); + Map map = WXPayUtil.xmlToMap(xmlStr); + + // 如果预支付返回状态码为不为SUCCESS,说明预支付接口调用失败(通讯业务失败),抛出异常,业务进行处理 + if (!map.get("return_code").equals("SUCCESS")) { + throw new CustomException(map.get("return_msg")); + } + // 如果预支付返回状态码为不为SUCCESS,说明预支付接口调用失败(交易业务失败),抛出异常,业务进行处理 + if (!map.get("result_code ").equals("SUCCESS")) { + throw new CustomException(map.get("err_code_des")); + } + return map.get("prepay_id"); + } + + /** + * 订单支付状态查询 + * + * @param wechat_appid + * @param wechat_mchid + * @param wechat_seckey + * @param out_trade_no + * @return + * @throws Exception + */ + public static Map orderQuery(String wechat_appid, String wechat_mchid, String wechat_seckey, String out_trade_no) throws Exception { + //拼接 参数 + Map paraMap = new HashMap(); + paraMap.put("appid", wechat_appid); + paraMap.put("mch_id", wechat_mchid); + paraMap.put("nonce_str", IdUtil.fastSimpleUUID()); + paraMap.put("out_trade_no", out_trade_no);//订单号 + String sign = WXPayUtil.generateSignature(paraMap, wechat_seckey); + paraMap.put("sign", sign); + String xml = WXPayUtil.mapToXml(paraMap);//将所有参数(map)转xml格式 + String xmlStr = HttpUtils.sendPost(WeChatConstants.ORDERQUERY_URL, xml);//发送post请求"统一下单接口"返回预支付id:prepay_id + return WXPayUtil.xmlToMap(xmlStr); + } + + /** + * XML格式字符串转换为Map + * + * @param strXML XML字符串 + * @return XML数据转换后的Map + */ + public static Map xmlToMap(String strXML) throws Exception { + Map data = new HashMap<>(); + DocumentBuilder documentBuilder = WXPayXmlUtil.newDocumentBuilder(); +// InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8")); + InputStream stream = new ByteArrayInputStream(strXML.getBytes("GBK")); + 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) { + Element element = (Element) node; + data.put(element.getNodeName(), element.getTextContent()); + } + } + try { + stream.close(); + } catch (Exception ignored) { + + } + return data; + } + + + /** + * 将Map转换为XML格式的字符串 + * + * @param data Map类型数据 + * @return XML格式的字符串 + * @throws Exception 系统异常 + */ + public static String mapToXml(Map data) throws Exception { + Document document = WXPayXmlUtil.newDocument(); + Element root = document.createElement("xml"); + document.appendChild(root); + for (String key : data.keySet()) { + String value = data.get(key); + if (value == null) { + value = ""; + } + value = value.trim(); + 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, "GBK"); +// 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 ignored) { + } + return output; + } + + + /** + * 生成带有 sign 的 XML 格式字符串 + * + * @param data Map类型数据 + * @param key API密钥 + * @return 含有sign字段的XML + */ + public static String generateSignedXml(final Map data, String key) throws Exception { + return generateSignedXml(data, key, WeChatConstants.SignType.MD5); + } + + /** + * 生成带有 sign 的 XML 格式字符串 + * + * @param data Map类型数据 + * @param key API密钥 + * @param signType 签名类型 + * @return 含有sign字段的XML + */ + public static String generateSignedXml(final Map data, String key, WeChatConstants.SignType signType) throws Exception { + String sign = generateSignature(data, key, signType); + data.put(WeChatConstants.FIELD_SIGN, sign); + return mapToXml(data); + } + + + /** + * 判断签名是否正确 + * + * @param xmlStr XML格式数据 + * @param key API密钥 + * @return 签名是否正确 + * @throws Exception 系统异常 + */ + public static boolean isSignatureValid(String xmlStr, String key) throws Exception { + Map data = xmlToMap(xmlStr); + if (!data.containsKey(WeChatConstants.FIELD_SIGN)) { + return false; + } + String sign = data.get(WeChatConstants.FIELD_SIGN); + return generateSignature(data, key).equals(sign); + } + + /** + * 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。 + * + * @param data Map类型数据 + * @param key API密钥 + * @return 签名是否正确 + * @throws Exception 系统异常 + */ + public static boolean isSignatureValid(Map data, String key) throws Exception { + return isSignatureValid(data, key, WeChatConstants.SignType.MD5); + } + + /** + * 判断签名是否正确,必须包含sign字段,否则返回false。 + * + * @param data Map类型数据 + * @param key API密钥 + * @param signType 签名方式 + * @return 签名是否正确 + * @throws Exception 系统异常 + */ + public static boolean isSignatureValid(Map data, String key, WeChatConstants.SignType signType) throws Exception { + if (!data.containsKey(WeChatConstants.FIELD_SIGN)) { + return false; + } + String sign = data.get(WeChatConstants.FIELD_SIGN); + return generateSignature(data, key, signType).equals(sign); + } + + /** + * 生成签名 + * + * @param data 待签名数据 + * @param key API密钥 + * @return 签名 + */ + public static String generateSignature(final Map data, String key) throws Exception { + return generateSignature(data, key, WeChatConstants.SignType.MD5); + } + + /** + * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。 + * + * @param data 待签名数据 + * @param key API密钥 + * @param signType 签名方式 + * @return 签名 + */ + public static String generateSignature(final Map data, String key, WeChatConstants.SignType signType) throws Exception { + Set keySet = data.keySet(); + String[] keyArray = keySet.toArray(new String[0]); + Arrays.sort(keyArray); + StringBuilder sb = new StringBuilder(); + for (String k : keyArray) { + if (k.equals(WeChatConstants.FIELD_SIGN)) { + continue; + } + // 参数值为空,则不参与签名 + if (!data.get(k).trim().isEmpty()) { + sb.append(k).append("=").append(data.get(k).trim()).append("&"); + } + } + sb.append("key=").append(key); + if (WeChatConstants.SignType.MD5.equals(signType)) { + return MD5(sb.toString()).toUpperCase(); + } else if (WeChatConstants.SignType.HMACSHA256.equals(signType)) { + return HmacSHA256(sb.toString(), key); + } else { + throw new Exception(String.format("Invalid sign_type: %s", signType)); + } + } + + + /** + * 获取随机字符串 Nonce Str + * + * @return String 随机字符串 + */ + public static String generateNonceStr() { + char[] nonceChars = new char[32]; + for (int index = 0; index < nonceChars.length; ++index) { + nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length())); + } + return new String(nonceChars); + } + + + /** + * 生成 MD5 + * + * @param data 待处理数据 + * @return MD5结果 + */ + public static String MD5(String data) throws Exception { + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(data.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3); + } + return sb.toString().toUpperCase(); + } + + /** + * 生成 HmacSHA256 + * + * @param data 待处理数据 + * @param key 密钥 + * @return 加密结果 + * @throws NoSuchAlgorithmException,InvalidKeyException 系统异常 + */ + public static String HmacSHA256(String data, String key) throws NoSuchAlgorithmException, InvalidKeyException { + Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); + SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); + sha256_HMAC.init(secret_key); + byte[] array = sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100), 1, 3); + } + return sb.toString().toUpperCase(); + } + + /** + * 获取当前时间戳,单位秒 + */ + public static long getCurrentTimestamp() { + return System.currentTimeMillis() / 1000; + } +} diff --git a/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java b/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java index 2748347..c52030c 100644 --- a/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java +++ b/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java @@ -23,6 +23,9 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import javax.annotation.Resource; import java.util.Set; @@ -58,7 +61,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/login", "/captcha/get-captcha", "/wx/**").permitAll() // 跨域请求会先进行一次options请求 .antMatchers(HttpMethod.OPTIONS).permitAll().anyRequest()// 除上面外的所有请求全部需要鉴权认证 - .authenticated(); + .authenticated().and().cors().configurationSource(this.corsConfigurationSource()); // 禁用缓存 httpSecurity.headers().cacheControl(); // 添加Logout filter @@ -69,6 +72,18 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { httpSecurity.exceptionHandling().accessDeniedHandler(customAccessDeniedHandler).authenticationEntryPoint(customAuthenticationEntryPoint); } + private CorsConfigurationSource corsConfigurationSource(){ + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.setAllowCredentials(true); + corsConfiguration.addAllowedHeader("*"); // 这个得加上,一些复杂的请求方式会带有header,不加上跨域会失效。 + corsConfiguration.addAllowedMethod("*"); + corsConfiguration.addExposedHeader("*"); + corsConfiguration.addAllowedOriginPattern("*"); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**",corsConfiguration); + return source; + } + @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder()); diff --git a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java index 4ff3735..47b2db4 100644 --- a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java +++ b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java @@ -5,7 +5,9 @@ import cn.hutool.core.util.StrUtil; import com.starry.admin.common.component.JwtToken; import com.starry.admin.common.domain.LoginUser; import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; import com.starry.admin.modules.clear.service.impl.PlayClerkUserInfoServiceImpl; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; import com.starry.admin.modules.custom.service.impl.PlayCustomUserInfoServiceImpl; import com.starry.admin.modules.platform.entity.SysTenantEntity; import com.starry.admin.modules.platform.service.ISysTenantService; @@ -23,11 +25,11 @@ import org.springframework.web.servlet.HandlerExceptionResolver; import javax.annotation.Resource; import javax.servlet.FilterChain; -import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; -import java.io.IOException; +import java.util.HashMap; +import java.util.Map; /** * @author admin @@ -61,29 +63,62 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Override - protected void doFilterInternal(@NotNull HttpServletRequest httpServletRequest, @NotNull HttpServletResponse httpServletResponse, @NotNull FilterChain filterChain) throws ServletException, IOException { - // 微信公众号的请求 - if (httpServletRequest.getServletPath().startsWith("/wx/")) { - String clerkToken = httpServletRequest.getHeader(Constants.CLERK_USER_LOGIN_TOKEN); - String customToken = httpServletRequest.getHeader(Constants.CUSTOM_USER_LOGIN_TOKEN); - String tenantKey = httpServletRequest.getHeader("tenantkey"); - String tenantId = getTenantId(clerkToken, customToken, tenantKey); - if (!checkTenantId(tenantId)) { - resolver.resolveException(httpServletRequest, httpServletResponse, null, new CustomException("租户信息异常")); - return; - } - SecurityUtils.setTenantId(tenantId); - } else { - // 管理端的请求 - LoginUser jwtUser = jwtToken.getNewLoginUser(httpServletRequest); - if (null != jwtUser && null == SecurityContextHolder.getContext().getAuthentication()) { - jwtToken.verifyToken(jwtUser); - UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); - SecurityContextHolder.getContext().setAuthentication(authentication); + protected void doFilterInternal(@NotNull HttpServletRequest httpServletRequest, @NotNull HttpServletResponse httpServletResponse, @NotNull FilterChain filterChain) { + log.info("url = {}", httpServletRequest.getRequestURI()); + try { + + + // 微信公众号的请求,必须存在tenantkey,否则抛出异常 + if (httpServletRequest.getServletPath().startsWith("/wx/")) { + String tenantKey = httpServletRequest.getHeader("tenantkey"); + if (StrUtil.isBlank(tenantKey)) { + resolver.resolveException(httpServletRequest, httpServletResponse, null, new CustomException("tenantkey不能为空")); + return; + } + Map notLoginUrls = new HashMap<>(); + notLoginUrls.put("/wx/common/area/tree", "1"); + notLoginUrls.put("/wx/common/file/upload", "1"); + notLoginUrls.put("/wx/common/audio/upload", "1"); + notLoginUrls.put("/wx/oauth2/getConfigAddress", "1"); + notLoginUrls.put("/clerk/level/queryAll", "1"); + notLoginUrls.put("/wx/clerk/class/queryAll", "1"); + notLoginUrls.put("/wx/clerk/user/queryByPage", "1"); + notLoginUrls.put("/wx/clerk/user/queryGiftById", "1"); + notLoginUrls.put("/wx/clerk/user/queryPriceById", "1"); + notLoginUrls.put("/wx/clerk/user/queryTrendsById", "1"); + notLoginUrls.put("/wx/clerk/user/queryEvaluateById", "1"); + if (notLoginUrls.containsKey(httpServletRequest.getServletPath())) { + String tenantId = getTenantId(null, null, tenantKey); + if (!checkTenantId(tenantId)) { + resolver.resolveException(httpServletRequest, httpServletResponse, null, new CustomException("租户信息异常")); + return; + } + SecurityUtils.setTenantId(tenantId); + } else { + String clerkToken = httpServletRequest.getHeader(Constants.CLERK_USER_LOGIN_TOKEN); + String customToken = httpServletRequest.getHeader(Constants.CUSTOM_USER_LOGIN_TOKEN); + String tenantId = getTenantId(clerkToken, customToken, tenantKey); + if (!checkTenantId(tenantId)) { + resolver.resolveException(httpServletRequest, httpServletResponse, null, new CustomException("租户信息异常")); + return; + } + SecurityUtils.setTenantId(tenantId); + } + } else { + // 管理端的请求 + LoginUser jwtUser = jwtToken.getNewLoginUser(httpServletRequest); + if (null != jwtUser && null == SecurityContextHolder.getContext().getAuthentication()) { + jwtToken.verifyToken(jwtUser); + UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } } + filterChain.doFilter(httpServletRequest, httpServletResponse); + } catch (Exception e) { + log.error("系统异常", e); + resolver.resolveException(httpServletRequest, httpServletResponse, null, new CustomException("租户及授权验证失败")); } - filterChain.doFilter(httpServletRequest, httpServletResponse); } @@ -98,27 +133,34 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { */ public String getTenantId(String clerkToken, String customToken, String tenantKey) { String tenantId = ""; - //如果用户(陪玩或客户)已登录,从token中获取租户ID - if (StrUtil.isNotBlank(clerkToken) || StrUtil.isNotBlank(customToken)) { - String userId; - try { - userId = tokenService.getWxUserIdByToken(StrUtil.isNotBlank(clerkToken) ? clerkToken : customToken); - } catch (Exception e) { - return ""; - } - if (clerkToken != null) { + try { + //如果用户(陪玩或客户)已登录,从token中获取租户ID + if (StrUtil.isNotBlank(clerkToken) || StrUtil.isNotBlank(customToken)) { + String userId = tokenService.getWxUserIdByToken(StrUtil.isNotBlank(clerkToken) ? clerkToken : customToken); String redisKey = "TENANT_INFO:" + userId; SecurityUtils.setTenantId(redisCache.getCacheObject(redisKey)); - tenantId = clerkUserInfoService.selectById(userId).getTenantId(); + if (clerkToken != null) { + PlayClerkUserInfoEntity entity = clerkUserInfoService.selectById(userId); + if (entity == null) { + log.error("当前登录陪玩不存在,clerkToken={},tenantKey={}", clerkToken, tenantKey); + } + tenantId = entity != null ? entity.getTenantId() : ""; + } else { + PlayCustomUserInfoEntity entity = customUserInfoService.selectById(userId); + if (entity == null) { + log.error("当前登录顾客不存在,customToken={},tenantKey={}", customToken, tenantKey); + } + tenantId = entity != null ? entity.getTenantId() : ""; + } } else { - tenantId = customUserInfoService.selectById(userId).getTenantId(); - } - } else { - // 如果用户未登录,从tenantKey中获取租户ID,然后验证租户ID是否存在,以及租户是否过期等 - SysTenantEntity entity = sysTenantService.selectByTenantKey(tenantKey); - if (entity != null) { - tenantId = entity.getTenantId(); + // 如果用户未登录,从tenantKey中获取租户ID,然后验证租户ID是否存在,以及租户是否过期等 + SysTenantEntity entity = sysTenantService.selectByTenantKey(tenantKey); + if (entity != null) { + tenantId = entity.getTenantId(); + } } + } catch (Exception e) { + log.error("获取tenantKey异常,clerkToken={},customToken={},tenantKey = {}", clerkToken, customToken, tenantKey, e); } return tenantId; } diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/controller/PlayClerkArticleInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/article/controller/PlayClerkArticleInfoController.java new file mode 100644 index 0000000..7d2b78c --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/controller/PlayClerkArticleInfoController.java @@ -0,0 +1,87 @@ +package com.starry.admin.modules.article.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.starry.admin.modules.article.module.entity.PlayClerkArticleInfoEntity; +import com.starry.admin.modules.article.module.vo.PlayClerkArticleQueryVo; +import com.starry.admin.modules.article.module.vo.PlayClerkArticleReturnVo; +import com.starry.admin.modules.article.service.IPlayClerkArticleInfoService; +import com.starry.admin.modules.article.service.IPlayCustomArticleInfoService; +import com.starry.common.annotation.Log; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 店员动态信息Controller + * + * @author admin + * @since 2024-05-04 + */ +@RestController +@RequestMapping("/clerk/article") +public class PlayClerkArticleInfoController { + @Resource + private IPlayClerkArticleInfoService playClerkArticleInfoService; + @Resource + private IPlayCustomArticleInfoService playCustomArticleInfoService; + + + /** + * 查询店员动态信息列表 + */ + @PostMapping("/list") + public R list(PlayClerkArticleQueryVo vo) { + IPage list = playClerkArticleInfoService.selectPlayClerkArticleInfoByPage(vo); + return R.ok(list); + } + + /** + * 获取店员动态信息详细信息 + */ + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playClerkArticleInfoService.selectPlayClerkArticleInfoById(id)); + } + + /** + * 新增店员动态信息 + */ + @Log(title = "店员动态信息", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayClerkArticleInfoEntity playClerkArticleInfo) { + boolean success = playClerkArticleInfoService.create(playClerkArticleInfo); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + /** + * 修改店员动态信息 + */ + @Log(title = "店员动态信息", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update/{id}") + public R update(@PathVariable String id, @RequestBody PlayClerkArticleInfoEntity playClerkArticleInfo) { + playClerkArticleInfo.setId(id); + boolean success = playClerkArticleInfoService.update(playClerkArticleInfo); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除店员动态信息 + */ + @Log(title = "店员动态信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + for (String id : ids) { + playClerkArticleInfoService.deletePlayClerkArticleInfoById(id); + playCustomArticleInfoService.deleteByArticleId(id); + } + return R.ok(); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/controller/PlayCustomArticleInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/article/controller/PlayCustomArticleInfoController.java new file mode 100644 index 0000000..5d48dd6 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/controller/PlayCustomArticleInfoController.java @@ -0,0 +1,83 @@ +package com.starry.admin.modules.article.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.starry.admin.modules.article.module.entity.PlayCustomArticleInfoEntity; +import com.starry.admin.modules.article.service.IPlayCustomArticleInfoService; +import com.starry.common.annotation.Log; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 陪玩点赞动态信息Controller + * + * @author admin + * @since 2024-05-04 + */ +@RestController +@RequestMapping("/custom/article") +public class PlayCustomArticleInfoController { + @Resource + private IPlayCustomArticleInfoService playCustomArticleInfoService; + + /** + * 查询陪玩点赞动态信息列表 + */ + @PreAuthorize("@customSs.hasPermission('play:info:list')") + @GetMapping("/list") + public R list(PlayCustomArticleInfoEntity playCustomArticleInfo) { + IPage list = playCustomArticleInfoService.selectPlayCustomArticleInfoByPage(playCustomArticleInfo); + return R.ok(list); + } + + /** + * 获取陪玩点赞动态信息详细信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:query')") + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playCustomArticleInfoService.selectPlayCustomArticleInfoById(id)); + } + + /** + * 新增陪玩点赞动态信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:create')") + @Log(title = "陪玩点赞动态信息", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayCustomArticleInfoEntity playCustomArticleInfo) { + boolean success = playCustomArticleInfoService.create(playCustomArticleInfo); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + /** + * 修改陪玩点赞动态信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:edit')") + @Log(title = "陪玩点赞动态信息", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update/{id}") + public R update(@PathVariable String id, @RequestBody PlayCustomArticleInfoEntity playCustomArticleInfo) { + playCustomArticleInfo.setId(id); + boolean success = playCustomArticleInfoService.update(playCustomArticleInfo); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除陪玩点赞动态信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:remove')") + @Log(title = "陪玩点赞动态信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + return R.ok(playCustomArticleInfoService.deletePlayCustomArticleInfoByIds(ids)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/mapper/PlayClerkArticleInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/article/mapper/PlayClerkArticleInfoMapper.java new file mode 100644 index 0000000..6c47a35 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/mapper/PlayClerkArticleInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.article.mapper; + + +import com.github.yulichang.base.MPJBaseMapper; +import com.starry.admin.modules.article.module.entity.PlayClerkArticleInfoEntity; + +/** + * 店员动态信息Mapper接口 + * + * @author admin + * @since 2024-05-04 + */ +public interface PlayClerkArticleInfoMapper extends MPJBaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/mapper/PlayCustomArticleInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/article/mapper/PlayCustomArticleInfoMapper.java new file mode 100644 index 0000000..7578704 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/mapper/PlayCustomArticleInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.article.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.article.module.entity.PlayCustomArticleInfoEntity; + +/** + * 陪玩点赞动态信息Mapper接口 + * + * @author admin + * @since 2024-05-04 + */ +public interface PlayCustomArticleInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/module/entity/PlayClerkArticleInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/article/module/entity/PlayClerkArticleInfoEntity.java new file mode 100644 index 0000000..5599777 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/module/entity/PlayClerkArticleInfoEntity.java @@ -0,0 +1,73 @@ +package com.starry.admin.modules.article.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 店员动态信息对象 play_clerk_article_info + * + * @author admin + * @since 2024-05-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_clerk_article_info") +public class PlayClerkArticleInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 陪玩用户ID + */ + private String playUserId; + + /** + * 动态标题 + */ + private String articleTitle; + + /** + * 动态内容类型(0:图片,1:视频) + */ + private String articleType; + + /** + * 动态内容 + */ + private String articleCon; + + /** + * 发布时间 + */ + private Date releaseTime; + + /** + * 点赞人数 + */ + private Long agreedQuantity; + + /** + * 审核状态(0:未审核:1:审核通过,2:审核不通过) + */ + private String reviewState; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/module/entity/PlayCustomArticleInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/article/module/entity/PlayCustomArticleInfoEntity.java new file mode 100644 index 0000000..97da070 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/module/entity/PlayCustomArticleInfoEntity.java @@ -0,0 +1,53 @@ +package com.starry.admin.modules.article.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 陪玩点赞动态信息对象 play_custom_article_info + * + * @author admin + * @since 2024-05-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_custom_article_info") +public class PlayCustomArticleInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 动态ID + */ + private String articleId; + + /** + * 店员ID + */ + private String clerkUserId; + + /** + * 顾客ID + */ + private String customUserId; + + /** + * 点赞时间 + */ + private Date endorseTime; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/module/vo/PlayClerkArticleQueryVo.java b/play-admin/src/main/java/com/starry/admin/modules/article/module/vo/PlayClerkArticleQueryVo.java new file mode 100644 index 0000000..f931008 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/module/vo/PlayClerkArticleQueryVo.java @@ -0,0 +1,14 @@ +package com.starry.admin.modules.article.module.vo; + +import com.starry.common.domain.BasePageEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author admin + * 动态信息查询对象 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class PlayClerkArticleQueryVo extends BasePageEntity { +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/module/vo/PlayClerkArticleReturnVo.java b/play-admin/src/main/java/com/starry/admin/modules/article/module/vo/PlayClerkArticleReturnVo.java new file mode 100644 index 0000000..0ce75b0 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/module/vo/PlayClerkArticleReturnVo.java @@ -0,0 +1,68 @@ +package com.starry.admin.modules.article.module.vo; + +import lombok.Data; + +import java.util.Date; + +/** + * @author admin + * 动态信息查询返回对象 + */ +@Data +public class PlayClerkArticleReturnVo { + + + /** + * UUID + */ + private String id; + /** + * 陪玩用户ID + */ + private String userId; + + /** + * 陪玩用户昵称 + */ + private String nickname; + + /** + * 陪玩用户头像 + */ + private String avatar; + + /** + * 动态标题 + */ + private String articleTitle; + + /** + * 动态内容类型(0:图片,1:视频) + */ + private String articleType; + + /** + * 动态内容 + */ + private String articleCon; + + /** + * 发布时间 + */ + private Date releaseTime; + + /** + * 备注 + */ + private String remark; + + /** + * 点赞人数 + */ + private Long agreedQuantity; + + /** + * 审核状态(0:未审核:1:审核通过,2:审核不通过) + */ + private String reviewState; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/service/IPlayClerkArticleInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/article/service/IPlayClerkArticleInfoService.java new file mode 100644 index 0000000..1b68aa3 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/service/IPlayClerkArticleInfoService.java @@ -0,0 +1,65 @@ +package com.starry.admin.modules.article.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.article.module.entity.PlayClerkArticleInfoEntity; +import com.starry.admin.modules.article.module.vo.PlayClerkArticleQueryVo; +import com.starry.admin.modules.article.module.vo.PlayClerkArticleReturnVo; + + +/** + * 店员动态信息Service接口 + * + * @author admin + * @since 2024-05-04 + */ +public interface IPlayClerkArticleInfoService extends IService { + /** + * 查询店员动态信息 + * + * @param id 店员动态信息主键 + * @return 店员动态信息 + */ + PlayClerkArticleInfoEntity selectPlayClerkArticleInfoById(String id); + + + /** + * 查询店员动态信息列表 + * + * @param vo 店员动态信息查询对象 + * @return 店员动态信息集合 + */ + IPage selectPlayClerkArticleInfoByPage(PlayClerkArticleQueryVo vo); + + /** + * 新增店员动态信息 + * + * @param playClerkArticleInfo 店员动态信息 + * @return 结果 + */ + boolean create(PlayClerkArticleInfoEntity playClerkArticleInfo); + + /** + * 修改店员动态信息 + * + * @param playClerkArticleInfo 店员动态信息 + * @return 结果 + */ + boolean update(PlayClerkArticleInfoEntity playClerkArticleInfo); + + /** + * 批量删除店员动态信息 + * + * @param ids 需要删除的店员动态信息主键集合 + * @return 结果 + */ + int deletePlayClerkArticleInfoByIds(String[] ids); + + /** + * 删除店员动态信息信息 + * + * @param id 店员动态信息主键 + * @return 结果 + */ + int deletePlayClerkArticleInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/service/IPlayCustomArticleInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/article/service/IPlayCustomArticleInfoService.java new file mode 100644 index 0000000..7d96f49 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/service/IPlayCustomArticleInfoService.java @@ -0,0 +1,69 @@ +package com.starry.admin.modules.article.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.article.module.entity.PlayCustomArticleInfoEntity; + +/** + * 陪玩点赞动态信息Service接口 + * + * @author admin + * @since 2024-05-04 + */ +public interface IPlayCustomArticleInfoService extends IService { + /** + * 查询陪玩点赞动态信息 + * + * @param id 陪玩点赞动态信息主键 + * @return 陪玩点赞动态信息 + */ + PlayCustomArticleInfoEntity selectPlayCustomArticleInfoById(String id); + + /** + * 查询陪玩点赞动态信息列表 + * + * @param playCustomArticleInfo 陪玩点赞动态信息 + * @return 陪玩点赞动态信息集合 + */ + IPage selectPlayCustomArticleInfoByPage(PlayCustomArticleInfoEntity playCustomArticleInfo); + + /** + * 新增陪玩点赞动态信息 + * + * @param playCustomArticleInfo 陪玩点赞动态信息 + * @return 结果 + */ + boolean create(PlayCustomArticleInfoEntity playCustomArticleInfo); + + /** + * 修改陪玩点赞动态信息 + * + * @param playCustomArticleInfo 陪玩点赞动态信息 + * @return 结果 + */ + boolean update(PlayCustomArticleInfoEntity playCustomArticleInfo); + + /** + * 批量删除陪玩点赞动态信息 + * + * @param ids 需要删除的陪玩点赞动态信息主键集合 + * @return 结果 + */ + int deletePlayCustomArticleInfoByIds(String[] ids); + + /** + * 删除陪玩点赞动态信息信息 + * + * @param id 陪玩点赞动态信息主键 + * @return 结果 + */ + int deletePlayCustomArticleInfoById(String id); + + + /** + * 根据动态ID删除点赞信息 + * + * @param articleId 动态ID + */ + void deleteByArticleId(String articleId); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/service/impl/PlayClerkArticleInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/article/service/impl/PlayClerkArticleInfoServiceImpl.java new file mode 100644 index 0000000..7ffc12d --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/service/impl/PlayClerkArticleInfoServiceImpl.java @@ -0,0 +1,106 @@ +package com.starry.admin.modules.article.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.starry.admin.modules.article.mapper.PlayClerkArticleInfoMapper; +import com.starry.admin.modules.article.module.entity.PlayClerkArticleInfoEntity; +import com.starry.admin.modules.article.module.vo.PlayClerkArticleQueryVo; +import com.starry.admin.modules.article.module.vo.PlayClerkArticleReturnVo; +import com.starry.admin.modules.article.service.IPlayClerkArticleInfoService; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * 店员动态信息Service业务层处理 + * + * @author admin + * @since 2024-05-04 + */ +@Service +public class PlayClerkArticleInfoServiceImpl extends ServiceImpl implements IPlayClerkArticleInfoService { + @Resource + private PlayClerkArticleInfoMapper playClerkArticleInfoMapper; + + /** + * 查询店员动态信息 + * + * @param id 店员动态信息主键 + * @return 店员动态信息 + */ + @Override + public PlayClerkArticleInfoEntity selectPlayClerkArticleInfoById(String id) { + return this.baseMapper.selectById(id); + } + + /** + * 查询店员动态信息列表 + * + * @param vo 店员动态信息查询对象 + * @return 店员动态信息 + */ + @Override + public IPage selectPlayClerkArticleInfoByPage(PlayClerkArticleQueryVo vo) { + MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper() + //查询主表全部字段 + .selectAll(PlayClerkArticleInfoEntity.class) + //陪玩用户表全部字段 + .selectAll(PlayClerkUserInfoEntity.class) + //陪玩用户表 + .leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, PlayClerkArticleInfoEntity::getPlayUserId); + return this.baseMapper.selectJoinPage(new Page<>(vo.getPageNum(), vo.getPageSize()), PlayClerkArticleReturnVo.class, lambdaQueryWrapper); + } + + /** + * 新增店员动态信息 + * + * @param playClerkArticleInfo 店员动态信息 + * @return 结果 + */ + @Override + public boolean create(PlayClerkArticleInfoEntity playClerkArticleInfo) { + if (StrUtil.isBlankIfStr(playClerkArticleInfo.getId())) { + playClerkArticleInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playClerkArticleInfo); + } + + /** + * 修改店员动态信息 + * + * @param playClerkArticleInfo 店员动态信息 + * @return 结果 + */ + @Override + public boolean update(PlayClerkArticleInfoEntity playClerkArticleInfo) { + return updateById(playClerkArticleInfo); + } + + /** + * 批量删除店员动态信息 + * + * @param ids 需要删除的店员动态信息主键 + * @return 结果 + */ + @Override + public int deletePlayClerkArticleInfoByIds(String[] ids) { + return playClerkArticleInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除店员动态信息信息 + * + * @param id 店员动态信息主键 + * @return 结果 + */ + @Override + public int deletePlayClerkArticleInfoById(String id) { + return playClerkArticleInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/article/service/impl/PlayCustomArticleInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/article/service/impl/PlayCustomArticleInfoServiceImpl.java new file mode 100644 index 0000000..d92f5a4 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/article/service/impl/PlayCustomArticleInfoServiceImpl.java @@ -0,0 +1,105 @@ +package com.starry.admin.modules.article.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.starry.admin.modules.article.mapper.PlayCustomArticleInfoMapper; +import com.starry.admin.modules.article.module.entity.PlayCustomArticleInfoEntity; +import com.starry.admin.modules.article.service.IPlayCustomArticleInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; + + +/** + * 陪玩点赞动态信息Service业务层处理 + * + * @author admin + * @since 2024-05-04 + */ +@Service +public class PlayCustomArticleInfoServiceImpl extends ServiceImpl implements IPlayCustomArticleInfoService { + @Resource + private PlayCustomArticleInfoMapper playCustomArticleInfoMapper; + + /** + * 查询陪玩点赞动态信息 + * + * @param id 陪玩点赞动态信息主键 + * @return 陪玩点赞动态信息 + */ + @Override + public PlayCustomArticleInfoEntity selectPlayCustomArticleInfoById(String id) { + return this.baseMapper.selectById(id); + } + + /** + * 查询陪玩点赞动态信息列表 + * + * @param playCustomArticleInfo 陪玩点赞动态信息 + * @return 陪玩点赞动态信息 + */ + @Override + public IPage selectPlayCustomArticleInfoByPage(PlayCustomArticleInfoEntity playCustomArticleInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); + } + + /** + * 新增陪玩点赞动态信息 + * + * @param playCustomArticleInfo 陪玩点赞动态信息 + * @return 结果 + */ + @Override + public boolean create(PlayCustomArticleInfoEntity playCustomArticleInfo) { + if (StrUtil.isBlankIfStr(playCustomArticleInfo.getId())) { + playCustomArticleInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playCustomArticleInfo); + } + + /** + * 修改陪玩点赞动态信息 + * + * @param playCustomArticleInfo 陪玩点赞动态信息 + * @return 结果 + */ + @Override + public boolean update(PlayCustomArticleInfoEntity playCustomArticleInfo) { + return updateById(playCustomArticleInfo); + } + + /** + * 批量删除陪玩点赞动态信息 + * + * @param ids 需要删除的陪玩点赞动态信息主键 + * @return 结果 + */ + @Override + public int deletePlayCustomArticleInfoByIds(String[] ids) { + return playCustomArticleInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除陪玩点赞动态信息信息 + * + * @param id 陪玩点赞动态信息主键 + * @return 结果 + */ + @Override + public int deletePlayCustomArticleInfoById(String id) { + return playCustomArticleInfoMapper.deleteById(id); + } + + @Override + public void deleteByArticleId(String articleId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayCustomArticleInfoEntity::getArticleId, articleId); + this.baseMapper.delete(lambdaQueryWrapper); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/controller/PlayBalanceDetailsInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/balance/controller/PlayBalanceDetailsInfoController.java new file mode 100644 index 0000000..92b1bbf --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/controller/PlayBalanceDetailsInfoController.java @@ -0,0 +1,77 @@ +package com.starry.admin.modules.balance.controller; + +import com.starry.admin.modules.balance.module.entity.PlayBalanceDetailsInfoEntity; +import com.starry.admin.modules.balance.module.vo.PlayBalanceDetailsQueryVo; +import com.starry.admin.modules.balance.service.IPlayBalanceDetailsInfoService; +import com.starry.common.annotation.Log; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 余额明细Controller + * + * @author admin + * @since 2024-04-30 + */ +@RestController +@RequestMapping("/balance/details") +public class PlayBalanceDetailsInfoController { + @Resource + private IPlayBalanceDetailsInfoService playBalanceDetailsInfoService; + + + /** + * 查询余额明细列表 + */ + @PostMapping("/list") + public R list(@RequestBody PlayBalanceDetailsQueryVo vo) { + return R.ok(playBalanceDetailsInfoService.selectByPage(vo)); + } + + /** + * 获取余额明细详细信息 + */ + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playBalanceDetailsInfoService.selectPlayBalanceDetailsInfoById(id)); + } + + /** + * 新增余额明细 + */ + @Log(title = "余额明细", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayBalanceDetailsInfoEntity playBalanceDetailsInfo) { + boolean success = playBalanceDetailsInfoService.create(playBalanceDetailsInfo); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + /** + * 修改余额明细 + */ + @Log(title = "余额明细", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update/{id}") + public R update(@PathVariable String id, @RequestBody PlayBalanceDetailsInfoEntity playBalanceDetailsInfo) { + playBalanceDetailsInfo.setId(id); + boolean success = playBalanceDetailsInfoService.update(playBalanceDetailsInfo); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除余额明细 + */ + @Log(title = "余额明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + return R.ok(playBalanceDetailsInfoService.deletePlayBalanceDetailsInfoByIds(ids)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/mapper/PlayBalanceDetailsInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/balance/mapper/PlayBalanceDetailsInfoMapper.java new file mode 100644 index 0000000..215f4c5 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/mapper/PlayBalanceDetailsInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.balance.mapper; + + +import com.github.yulichang.base.MPJBaseMapper; +import com.starry.admin.modules.balance.module.entity.PlayBalanceDetailsInfoEntity; + +/** + * 余额明细Mapper接口 + * + * @author admin + * @since 2024-04-30 + */ +public interface PlayBalanceDetailsInfoMapper extends MPJBaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/module/entity/PlayBalanceDetailsInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/balance/module/entity/PlayBalanceDetailsInfoEntity.java new file mode 100644 index 0000000..73fbe0c --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/module/entity/PlayBalanceDetailsInfoEntity.java @@ -0,0 +1,72 @@ +package com.starry.admin.modules.balance.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 余额明细对象 play_balance_details_info + * + * @author admin + * @since 2024-04-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_balance_details_info") +public class PlayBalanceDetailsInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户ID + */ + private String userId; + + /** + * 用户类型[0:陪玩;1:顾客] + */ + private String userType; + + /** + * 操作前余额 + */ + private BigDecimal balanceBeforeOperation; + + /** + * 操作后余额 + */ + private BigDecimal balanceAfterOperation; + + /** + * 操作类型 + */ + private String operationType; + + /** + * 操作时间 + */ + private Date operationTime; + + /** + * 操作金额 + */ + private BigDecimal balanceMoney; + + /** + * 订单ID + */ + private String orderId; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/module/vo/PlayBalanceDetailsQueryVo.java b/play-admin/src/main/java/com/starry/admin/modules/balance/module/vo/PlayBalanceDetailsQueryVo.java new file mode 100644 index 0000000..6e62960 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/module/vo/PlayBalanceDetailsQueryVo.java @@ -0,0 +1,10 @@ +package com.starry.admin.modules.balance.module.vo; + +import com.starry.common.domain.BasePageEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PlayBalanceDetailsQueryVo extends BasePageEntity { +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/module/vo/PlayBalanceDetailsReturnVo.java b/play-admin/src/main/java/com/starry/admin/modules/balance/module/vo/PlayBalanceDetailsReturnVo.java new file mode 100644 index 0000000..3c75bbd --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/module/vo/PlayBalanceDetailsReturnVo.java @@ -0,0 +1,91 @@ +package com.starry.admin.modules.balance.module.vo; + +import com.starry.common.domain.BasePageEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +@EqualsAndHashCode(callSuper = true) +@Data +public class PlayBalanceDetailsReturnVo extends BasePageEntity { + + /** + * UUID + */ + private String id; + + /** + * 操作前余额 + */ + private BigDecimal balanceBeforeOperation; + + /** + * 操作后余额 + */ + private BigDecimal balanceAfterOperation; + + /** + * 操作类型 + */ + private String operationType; + + /** + * 操作时间 + */ + private Date operationTime; + + /** + * 操作金额 + */ + private BigDecimal balanceMoney; + + /** + * 订单ID + */ + private String orderId; + + + /** + * 订单金额 + */ + private BigDecimal orderMoney; + + /** + * 支付方式,0:余额支付,1:微信支付,2:支付宝支付 + */ + private String payMethod; + + /** + * 赠送金额 + */ + private BigDecimal giftAmount; + + + /** + * 订单最终金额 + */ + private BigDecimal finalAmount; + + /** + * 订单备注 + */ + private String orderRemark; + + + /** + * 顾客Id + */ + private String customUserId; + + /** + * 顾客昵称 + */ + private String nickname; + + /** + * 头像 + */ + private String avatar; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/service/IPlayBalanceDetailsInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/balance/service/IPlayBalanceDetailsInfoService.java new file mode 100644 index 0000000..5821a25 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/service/IPlayBalanceDetailsInfoService.java @@ -0,0 +1,88 @@ +package com.starry.admin.modules.balance.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.balance.module.entity.PlayBalanceDetailsInfoEntity; +import com.starry.admin.modules.balance.module.vo.PlayBalanceDetailsQueryVo; +import com.starry.admin.modules.balance.module.vo.PlayBalanceDetailsReturnVo; + +import java.math.BigDecimal; + +/** + * 余额明细Service接口 + * + * @author admin + * @since 2024-04-30 + */ +public interface IPlayBalanceDetailsInfoService extends IService { + /** + * 查询余额明细 + * + * @param id 余额明细主键 + * @return 余额明细 + */ + PlayBalanceDetailsInfoEntity selectPlayBalanceDetailsInfoById(String id); + + + /** + * 查询余额明细列表 + * + * @param vo 余额明细查询对象 + * @return 余额明细集合 + */ + IPage selectByPage(PlayBalanceDetailsQueryVo vo); + + + /** + * 查询余额明细列表 + * + * @param playBalanceDetailsInfo 余额明细 + * @return 余额明细集合 + */ + IPage selectPlayBalanceDetailsInfoByPage(PlayBalanceDetailsInfoEntity playBalanceDetailsInfo); + + + /** + * 新增余额明细信息 + * + * @param userType 用户类型[0:陪玩;1:顾客] + * @param userId 用户ID + * @param balanceBeforeOperation 操作前余额 + * @param balanceAfterOperation 操作后余额 + * @param operationType 操作类型 + * @param balanceMoney 操作金额 + */ + void create(String userType, String userId, BigDecimal balanceBeforeOperation, BigDecimal balanceAfterOperation, String operationType, BigDecimal balanceMoney); + + /** + * 新增余额明细 + * + * @param playBalanceDetailsInfo 余额明细 + * @return 结果 + */ + boolean create(PlayBalanceDetailsInfoEntity playBalanceDetailsInfo); + + /** + * 修改余额明细 + * + * @param playBalanceDetailsInfo 余额明细 + * @return 结果 + */ + boolean update(PlayBalanceDetailsInfoEntity playBalanceDetailsInfo); + + /** + * 批量删除余额明细 + * + * @param ids 需要删除的余额明细主键集合 + * @return 结果 + */ + int deletePlayBalanceDetailsInfoByIds(String[] ids); + + /** + * 删除余额明细信息 + * + * @param id 余额明细主键 + * @return 结果 + */ + int deletePlayBalanceDetailsInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/balance/service/impl/PlayBalanceDetailsInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/balance/service/impl/PlayBalanceDetailsInfoServiceImpl.java new file mode 100644 index 0000000..d102786 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/balance/service/impl/PlayBalanceDetailsInfoServiceImpl.java @@ -0,0 +1,140 @@ +package com.starry.admin.modules.balance.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.starry.admin.modules.balance.mapper.PlayBalanceDetailsInfoMapper; +import com.starry.admin.modules.balance.module.entity.PlayBalanceDetailsInfoEntity; +import com.starry.admin.modules.balance.module.vo.PlayBalanceDetailsQueryVo; +import com.starry.admin.modules.balance.module.vo.PlayBalanceDetailsReturnVo; +import com.starry.admin.modules.balance.service.IPlayBalanceDetailsInfoService; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Date; + +/** + * 余额明细Service业务层处理 + * + * @author admin + * @since 2024-04-30 + */ +@Service +public class PlayBalanceDetailsInfoServiceImpl extends ServiceImpl implements IPlayBalanceDetailsInfoService { + @Resource + private PlayBalanceDetailsInfoMapper playBalanceDetailsInfoMapper; + + /** + * 查询余额明细 + * + * @param id 余额明细主键 + * @return 余额明细 + */ + @Override + public PlayBalanceDetailsInfoEntity selectPlayBalanceDetailsInfoById(String id) { + return this.baseMapper.selectById(id); + } + + + @Override + public IPage selectByPage(PlayBalanceDetailsQueryVo vo) { + MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper() + //查询主表全部字段 + .selectAll(PlayBalanceDetailsInfoEntity.class) + //查询顾客表 + .selectAll(PlayCustomUserInfoEntity.class) + //查询订单表全部字段 + .selectAll(PlayOrderInfoEntity.class) + .selectAs(PlayOrderInfoEntity::getId, "orderId") + .selectAs(PlayOrderInfoEntity::getRemark, "orderId") + .leftJoin(PlayOrderInfoEntity.class, PlayOrderInfoEntity::getId, PlayBalanceDetailsInfoEntity::getOrderId) + .selectAs(PlayCustomUserInfoEntity::getId, "customUserId") + .leftJoin(PlayCustomUserInfoEntity.class, PlayCustomUserInfoEntity::getId, PlayBalanceDetailsInfoEntity::getUserId); + lambdaQueryWrapper.orderByDesc(PlayBalanceDetailsInfoEntity::getUserId); + lambdaQueryWrapper.orderByDesc(PlayBalanceDetailsInfoEntity::getOperationTime); + return this.baseMapper.selectJoinPage(new Page<>(vo.getPageNum(), vo.getPageSize()), PlayBalanceDetailsReturnVo.class, lambdaQueryWrapper); + + } + + /** + * 查询余额明细列表 + * + * @param playBalanceDetailsInfo 余额明细 + * @return 余额明细 + */ + @Override + public IPage selectPlayBalanceDetailsInfoByPage(PlayBalanceDetailsInfoEntity playBalanceDetailsInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); + } + + + @Override + public void create(String userType, String userId, BigDecimal balanceBeforeOperation, BigDecimal balanceAfterOperation, String operationType, BigDecimal balanceMoney) { + PlayBalanceDetailsInfoEntity entity = new PlayBalanceDetailsInfoEntity(); + entity.setId(IdUtil.fastSimpleUUID()); + entity.setUserType(userType); + entity.setUserId(userId); + entity.setBalanceBeforeOperation(balanceBeforeOperation); + entity.setBalanceAfterOperation(balanceAfterOperation); + entity.setOperationType(operationType); + entity.setBalanceMoney(balanceMoney); + entity.setOperationTime(new Date()); + this.baseMapper.insert(entity); + } + + /** + * 新增余额明细 + * + * @param playBalanceDetailsInfo 余额明细 + * @return 结果 + */ + @Override + public boolean create(PlayBalanceDetailsInfoEntity playBalanceDetailsInfo) { + if (StrUtil.isBlankIfStr(playBalanceDetailsInfo.getId())) { + playBalanceDetailsInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playBalanceDetailsInfo); + } + + /** + * 修改余额明细 + * + * @param playBalanceDetailsInfo 余额明细 + * @return 结果 + */ + @Override + public boolean update(PlayBalanceDetailsInfoEntity playBalanceDetailsInfo) { + return updateById(playBalanceDetailsInfo); + } + + /** + * 批量删除余额明细 + * + * @param ids 需要删除的余额明细主键 + * @return 结果 + */ + @Override + public int deletePlayBalanceDetailsInfoByIds(String[] ids) { + return playBalanceDetailsInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除余额明细信息 + * + * @param id 余额明细主键 + * @return 结果 + */ + @Override + public int deletePlayBalanceDetailsInfoById(String id) { + return playBalanceDetailsInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java index 89080a3..a95469a 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java @@ -2,14 +2,12 @@ package com.starry.admin.modules.clear.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.starry.admin.modules.clear.module.entity.PlayClerkCommodityEntity; -import com.starry.admin.modules.clear.module.vo.PlayClerkCommodityEditVo; import com.starry.admin.modules.clear.module.vo.PlayClerkCommodityQueryVo; import com.starry.admin.modules.clear.service.IPlayClerkCommodityService; import com.starry.common.annotation.Log; import com.starry.common.enums.BusinessType; import com.starry.common.result.R; import com.starry.common.utils.ConvertUtil; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -68,14 +66,6 @@ public class PlayClerkCommodityController { } - @Log(title = "启停陪玩服务项目", businessType = BusinessType.UPDATE) - @PostMapping(value = "/startStopClerkItem") - public R startStopClerkItem(@Validated @RequestBody PlayClerkCommodityEditVo vo) { - playClerkCommodityService.startStopClerkItem(vo.getCommodityType(), vo.getEnablingState()); - return R.ok("成功"); - } - - /** * 修改陪玩服务项目 */ diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java index 3073523..17d3625 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java @@ -1,5 +1,6 @@ package com.starry.admin.modules.clear.controller; +import com.starry.admin.common.exception.CustomException; import com.starry.admin.modules.clear.module.entity.PlayClerkLevelInfoEntity; import com.starry.admin.modules.clear.module.vo.PlayClerkLevelAddVo; import com.starry.admin.modules.clear.module.vo.PlayClerkLevelEditVo; @@ -78,6 +79,9 @@ public class PlayClerkLevelInfoController { @DeleteMapping("delMaxLevel") public R remove() { int level = playClerkLevelInfoService.selectMaxLevel(); + if (level <= 1) { + throw new CustomException("最后一级,不允许删除"); + } playClerkLevelInfoService.delMaxLevelByLevel(level); return R.ok(); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java index 98a242e..3d6440f 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java @@ -5,10 +5,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.starry.admin.modules.clear.module.entity.PlayClerkLevelInfoEntity; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoQueryVo; -import com.starry.admin.modules.clear.module.vo.PlayClerkLevelQueryReturnVo; -import com.starry.admin.modules.clear.module.vo.PlayClerkUserAddToWxVo; -import com.starry.admin.modules.clear.module.vo.PlayClerkUserAddVo; -import com.starry.admin.modules.clear.module.vo.PlayClerkUserEditVo; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserListResultVo; +import com.starry.admin.modules.clear.module.vo.*; import com.starry.admin.modules.clear.service.IPlayClerkCommodityService; import com.starry.admin.modules.clear.service.IPlayClerkLevelInfoService; import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; @@ -57,7 +55,7 @@ public class PlayClerkUserInfoController { */ @PostMapping("listByPage") public R listByPage(PlayClerkUserInfoQueryVo vo) { - IPage list = playClerkUserInfoService.selectPlayClerkUserInfoByPage(vo); + IPage list = playClerkUserInfoService.selectPlayClerkUserInfoByPage(vo); return R.ok(list); } @@ -67,7 +65,7 @@ public class PlayClerkUserInfoController { */ @GetMapping("/list") public R list(PlayClerkUserInfoQueryVo vo) { - IPage list = playClerkUserInfoService.selectPlayClerkUserInfoByPage(vo); + IPage list = playClerkUserInfoService.selectPlayClerkUserInfoByPage(vo); return R.ok(list); } @@ -131,6 +129,21 @@ public class PlayClerkUserInfoController { return R.error("修改失败"); } + + /** + * 修改店员状态 + */ + @Log(title = "店员", businessType = BusinessType.UPDATE) + @PostMapping(value = "/updateState") + public R updateState(@Validated @RequestBody PlayClerkUserStateEditVo vo) { + PlayClerkUserInfoEntity entity = ConvertUtil.entityToVo(vo, PlayClerkUserInfoEntity.class); + boolean success = playClerkUserInfoService.update(entity); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + /** * 删除店员 */ diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClarkUserEvaluateInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClarkUserEvaluateInfoEntity.java index bef019c..f941d81 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClarkUserEvaluateInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClarkUserEvaluateInfoEntity.java @@ -65,6 +65,11 @@ public class PlayClarkUserEvaluateInfoEntity { */ private String commodityUnit; + /** + * 点赞数 + */ + public Integer likeCount; + public PlayClarkUserEvaluateInfoEntity(String id, String evaluatorId, String evaluatorUsername, String evaluatorAvatar, String con, Date evaluateTime, String orderId, String clarkUsername, String commodityId, String commodityName, String commodityUnit) { this.id = id; @@ -79,4 +84,20 @@ public class PlayClarkUserEvaluateInfoEntity { this.commodityName = commodityName; this.commodityUnit = commodityUnit; } + + public PlayClarkUserEvaluateInfoEntity(String id, String evaluatorId, String evaluatorUsername, String evaluatorAvatar, String con, Date evaluateTime, String orderId, String clarkUsername, String commodityId, String commodityName, String commodityUnit, int likeCount) { + this.id = id; + this.evaluatorId = evaluatorId; + this.evaluatorUsername = evaluatorUsername; + this.evaluatorAvatar = evaluatorAvatar; + this.con = con; + this.evaluateTime = evaluateTime; + this.orderId = orderId; + this.clarkUsername = clarkUsername; + this.commodityId = commodityId; + this.commodityName = commodityName; + this.commodityUnit = commodityUnit; + this.likeCount = likeCount; + } + } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkCommodityEntity.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkCommodityEntity.java index 5a50335..76f0cc5 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkCommodityEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkCommodityEntity.java @@ -5,6 +5,8 @@ import com.starry.common.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + /** * 陪玩服务项目对象 play_clerk_commodity * @@ -13,7 +15,7 @@ import lombok.EqualsAndHashCode; */ @Data @EqualsAndHashCode(callSuper = false) -@TableName("play_clerk_commodity") +@TableName("play_clerk_commodity_info") public class PlayClerkCommodityEntity extends BaseEntity { @@ -50,8 +52,13 @@ public class PlayClerkCommodityEntity extends BaseEntity gifts; + private List gifts; /** * 服务项目 diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java index 56c8f39..433a890 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java @@ -8,6 +8,7 @@ import com.starry.common.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -38,6 +39,11 @@ public class PlayClerkUserInfoEntity extends BaseEntity */ private String phone; + /** + * 微信号码 + */ + private String weiChatCode; + /** * 陪玩用户ID */ @@ -58,6 +64,7 @@ public class PlayClerkUserInfoEntity extends BaseEntity */ private String levelId; + /** * 店员类型 */ @@ -120,9 +127,9 @@ public class PlayClerkUserInfoEntity extends BaseEntity private String city; /** - * 账户余额(单位分) + * 账户余额 */ - private String accountBalance; + private BigDecimal accountBalance; /** * 备注 @@ -172,10 +179,10 @@ public class PlayClerkUserInfoEntity extends BaseEntity /** * 随机接单状态【1:允许,0:禁止】 */ - private String randomOrder; + private String randomOrderState; /** - * 店员状态(0:不是陪玩,1:陪玩) + * 店员状态(0:不是陪玩,1:陪玩,2:资料审核中) */ private String clerkState; /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java index afeded3..0121a39 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java @@ -24,7 +24,6 @@ public class PlayClerkUserInfoQueryVo extends BasePageEntity { */ private String levelId; - /** * 店员类型 */ @@ -45,10 +44,15 @@ public class PlayClerkUserInfoQueryVo extends BasePageEntity { */ private String listingState; + /** + * 是否推荐状态(1:已推荐,0:未推荐) + */ + private String recommendationState; + /** * 员工状态【1:是陪玩,0:不是陪玩】 */ - private String clerkState; + private String clerkState = "1"; /** * 手机号码 @@ -56,5 +60,4 @@ public class PlayClerkUserInfoQueryVo extends BasePageEntity { private String phone; - } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserListResultVo.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserListResultVo.java index d93c33a..56a0240 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserListResultVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserListResultVo.java @@ -45,6 +45,12 @@ public class PlayClerkUserListResultVo { */ private String audio; + + /** + * 星座 + */ + private String constellation; + /** * 标签 */ @@ -65,6 +71,16 @@ public class PlayClerkUserListResultVo { */ private Integer age; + /** + * 所在省份 + */ + private String province; + + /** + * 所在城市 + */ + private String city; + /** * 关注(0:未关注,1:已关注) @@ -76,9 +92,43 @@ public class PlayClerkUserListResultVo { */ private String onlineState; + /** + * 上架状态【1:上架,0:下架】 + */ + private String listingState; + + + /** + * 实名状态【1:已实名,0:未实名】 + */ + private String realState; + + /** + * 是否必须实名【1:必须实名,0:非必须实名,2:跟随店铺设置】 + */ + private String mandatoryRealState; + + /** + * 随机接单状态【1:允许,0:禁止】 + */ + private String randomOrderState; + + /** * 服务项目 */ private List commodity; + /** + * 地址 + */ + private String address; + + + /** + * 最低消费 + */ + private String latestConsumption = "最低1船票"; + + } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayGiftInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayGiftInfoVo.java similarity index 81% rename from play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayGiftInfoEntity.java rename to play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayGiftInfoVo.java index 77f0488..19fccd5 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayGiftInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayGiftInfoVo.java @@ -8,7 +8,7 @@ import lombok.Data; */ @Data -public class PlayGiftInfoEntity { +public class PlayGiftInfoVo { /** @@ -37,7 +37,7 @@ public class PlayGiftInfoEntity { */ private String state; - public PlayGiftInfoEntity(String id, String name, String url, Integer number, String state) { + public PlayGiftInfoVo(String id, String name, String url, Integer number, String state) { this.id = id; this.name = name; this.url = url; diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddVo.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddVo.java index 6e4cc64..86c7221 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddVo.java @@ -97,4 +97,5 @@ public class PlayClerkUserAddVo { */ private String remark; + } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserStateEditVo.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserStateEditVo.java new file mode 100644 index 0000000..19ee1ab --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserStateEditVo.java @@ -0,0 +1,58 @@ +package com.starry.admin.modules.clear.module.vo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + + +@Data +public class PlayClerkUserStateEditVo { + + /** + * id + */ + @NotBlank(message = "id不能为空") + private String id; + + /** + * 是否推荐状态(1:已推荐,0:未推荐) + */ + private String recommendationState; + + /** + * 是否置顶状态(1:已置顶,0:未置顶) + */ + private String pinToTopState; + + /** + * 在线状态【1:在线,0:离线】 + */ + private String onlineState; + + /** + * 上架状态【1:上架,0:下架】 + */ + private String listingState; + + /** + * 显示状态【1:显示,0:隐藏】 + */ + private String displayState; + + /** + * 实名状态【1:已实名,0:未实名】 + */ + private String realState; + + /** + * 是否必须实名【1:必须实名,0:非必须实名】 + */ + private String mandatoryRealState; + + /** + * 随机接单状态【1:允许,0:禁止】 + */ + private String randomOrderState; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkCommodityService.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkCommodityService.java index c0f54e2..b2e3e0e 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkCommodityService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkCommodityService.java @@ -23,6 +23,22 @@ public interface IPlayClerkCommodityService extends IService getClerkCommodityList(String userId); + + /** + * 根据用户ID,查询当前用户的服务项目类型 + * + * @param userId 用户ID + * @return List + */ + List selectCommodityTypeByUser(String userId); + /** * 根据用户ID,查询当前用户的服务项目 * @@ -42,8 +58,9 @@ public interface IPlayClerkCommodityService extends IService { + + /** + * 获取新增陪玩时,默认最低等级ID + * @return PlayClerkLevelInfoEntity + */ + PlayClerkLevelInfoEntity getDefaultLevel(); + /** + * * 查询店员等级 * * @param id 店员等级主键 diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java index 308028f..5196b1b 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java @@ -4,8 +4,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoQueryVo; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserListResultVo; import com.starry.admin.modules.weichat.entity.PlayClerkUserLoginResponseVo; +import java.math.BigDecimal; + /** * 店员Service接口 @@ -48,7 +51,7 @@ public interface IPlayClerkUserInfoService extends IService selectByPage(PlayClerkUserInfoQueryVo vo, String customUserId); + /** * 查询店员列表 * * @param vo 店员查询对象 * @return 店员集合 */ - IPage selectPlayClerkUserInfoByPage(PlayClerkUserInfoQueryVo vo); + IPage selectPlayClerkUserInfoByPage(PlayClerkUserInfoQueryVo vo); /** * 新增店员 diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkCommodityServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkCommodityServiceImpl.java index 2c4c62c..1ad48b3 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkCommodityServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkCommodityServiceImpl.java @@ -15,8 +15,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Arrays; -import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * 陪玩服务项目Service业务层处理 @@ -35,14 +35,20 @@ public class PlayClerkCommodityServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayClerkCommodityEntity::getPlayUserId, userId); + this.baseMapper.delete(lambdaQueryWrapper); + //根据当前租户的服务项目,生成陪玩项目数据 for (PlayCommodityInfoEntity commodityInfo : playCommodityInfoService.selectAll()) { PlayClerkCommodityEntity entity = new PlayClerkCommodityEntity(); - entity.setPlayUserId(playUserId); + entity.setPlayUserId(userId); entity.setCommodityId(commodityInfo.getId()); entity.setCommodityType(commodityInfo.getItemType()); entity.setCommodityName(commodityInfo.getItemName()); entity.setCommodityPrice(commodityInfo.getPrice()); + entity.setServiceDuration(commodityInfo.getServiceDuration()); entity.setEnablingState("1"); this.create(entity); } @@ -51,10 +57,23 @@ public class PlayClerkCommodityServiceImpl extends ServiceImpl selectByUser(String playUserId) { + public List getClerkCommodityList(String userId) { + List list = this.selectCommodityTypeByUser(userId); + return list.stream().map(PlayClerkCommodityEntity::getCommodityType).collect(Collectors.toList()); + } + + @Override + public List selectCommodityTypeByUser(String userId) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.groupBy(PlayClerkCommodityEntity::getCommodityType); - lambdaQueryWrapper.eq(PlayClerkCommodityEntity::getPlayUserId, playUserId); + lambdaQueryWrapper.eq(PlayClerkCommodityEntity::getPlayUserId, userId); + return this.baseMapper.selectList(lambdaQueryWrapper); + } + + @Override + public List selectByUser(String userId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayClerkCommodityEntity::getPlayUserId, userId); return this.baseMapper.selectList(lambdaQueryWrapper); } @@ -65,11 +84,11 @@ public class PlayClerkCommodityServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(PlayClerkCommodityEntity::getPlayUserId, "1"); + lambdaQueryWrapper.eq(PlayClerkCommodityEntity::getPlayUserId, clerkUserId); lambdaQueryWrapper.eq(PlayClerkCommodityEntity::getCommodityType, type); this.baseMapper.update(entity, lambdaQueryWrapper); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkLevelInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkLevelInfoServiceImpl.java index e446bcd..0ad61fd 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkLevelInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkLevelInfoServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.starry.admin.common.exception.CustomException; import com.starry.admin.modules.clear.mapper.PlayClerkLevelInfoMapper; import com.starry.admin.modules.clear.module.entity.PlayClerkLevelInfoEntity; import com.starry.admin.modules.clear.service.IPlayClerkLevelInfoService; @@ -27,6 +28,15 @@ public class PlayClerkLevelInfoServiceImpl extends ServiceImpl list = this.selectAll(); + if (list != null && !list.isEmpty()) { + return list.get(0); + } + throw new CustomException("系统错误,等级数据未初始化"); + } + /** * 查询店员等级 * @@ -41,7 +51,7 @@ public class PlayClerkLevelInfoServiceImpl extends ServiceImpl selectAll() { - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.orderByAsc(PlayClerkLevelInfoEntity::getLevel); return this.baseMapper.selectList(lambdaQueryWrapper); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java index 8f39191..93acc70 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java @@ -8,19 +8,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.starry.admin.modules.clear.mapper.PlayClerkUserInfoMapper; -import com.starry.admin.modules.clear.module.entity.PlayClerkDataReviewInfoEntity; -import com.starry.admin.modules.clear.module.entity.PlayClerkLevelInfoEntity; -import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; -import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoQueryVo; +import com.starry.admin.modules.clear.module.entity.*; import com.starry.admin.modules.clear.module.vo.PlayClerkCommodityQueryVo; import com.starry.admin.modules.clear.service.IPlayClerkCommodityService; -import com.starry.admin.modules.clear.service.IPlayClerkDataReviewInfoService; import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; +import com.starry.admin.modules.follow.module.entity.PlayCustomFollowInfoEntity; +import com.starry.admin.modules.follow.service.IPlayCustomFollowInfoService; import com.starry.admin.modules.weichat.entity.PlayClerkUserLoginResponseVo; import com.starry.common.utils.ConvertUtil; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -46,7 +45,7 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(PlayClerkUserInfoEntity::getPlayUserId, openId); + lambdaQueryWrapper.eq(PlayClerkUserInfoEntity::getOpenid, openId); return this.baseMapper.selectOne(lambdaQueryWrapper); } @@ -74,12 +73,13 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl list = dataReviewInfoService.queryList(dataReviewInfo); Map map = list.stream().collect(Collectors.toMap(PlayClerkDataReviewInfoEntity::getDataType, account -> account)); @@ -92,10 +92,10 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl selectPlayClerkUserInfoByPage(PlayClerkUserInfoQueryVo vo) { - Page page = new Page<>(vo.getPageNum(), vo.getPageSize()); + public IPage selectPlayClerkUserInfoByPage(PlayClerkUserInfoQueryVo vo) { + Page page = new Page<>(vo.getPageNum(), vo.getPageSize()); MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper() //查询主表全部字段 - .selectAll(PlayClerkUserInfoEntity.class) + .selectAll(PlayClerkUserInfoEntity.class).selectAs(PlayClerkUserInfoEntity::getCity, "address") //等级表 .selectAs(PlayClerkLevelInfoEntity::getName, "levelName").leftJoin(PlayClerkLevelInfoEntity.class, PlayClerkLevelInfoEntity::getId, PlayClerkUserInfoEntity::getLevelId); + + //服务项目表 - - if (StrUtil.isNotBlank(vo.getNickname())) { lambdaQueryWrapper.like(PlayClerkUserInfoEntity::getNickname, vo.getNickname()); } @@ -145,9 +155,32 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl selectByPage(PlayClerkUserInfoQueryVo vo, String customUserId) { + IPage voIPage = this.selectPlayClerkUserInfoByPage(vo); + // 如果当前顾客已登录,查询是否关注 + if (StrUtil.isNotBlank(customUserId)) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayCustomFollowInfoEntity::getCustomUserId, customUserId); + List customFollowInfoEntities = customFollowInfoService.list(lambdaQueryWrapper); + Map customFollows = customFollowInfoEntities.stream().collect(Collectors.toMap(PlayCustomFollowInfoEntity::getClerkUserId, PlayCustomFollowInfoEntity::getFollowState)); + for (PlayClerkUserListResultVo record : voIPage.getRecords()) { + if (customFollows.containsKey(record.getId())) { + record.setFollowState(customFollows.get(record.getId())); + record.setCommodity(playClerkCommodityService.getClerkCommodityList(record.getId())); + record.setAddress(record.getCity()); + } + } + } + + return voIPage; } /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomLevelInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomLevelInfoController.java new file mode 100644 index 0000000..9f9d1c4 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomLevelInfoController.java @@ -0,0 +1,94 @@ +package com.starry.admin.modules.custom.controller; + +import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.custom.module.entity.PlayCustomLevelInfoEntity; +import com.starry.admin.modules.custom.module.vo.PlayCustomLevelAddVo; +import com.starry.admin.modules.custom.module.vo.PlayCustomLevelEditVo; +import com.starry.admin.modules.custom.service.IPlayCustomLevelInfoService; +import com.starry.common.annotation.Log; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; +import com.starry.common.utils.ConvertUtil; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 顾客等级Controller + * + * @author admin + * @since 2024-05-04 + */ +@RestController +@RequestMapping("/custom/level") +public class PlayCustomLevelInfoController { + @Resource + private IPlayCustomLevelInfoService playCustomLevelInfoService; + + /** + * 查询顾客等级列表 + */ + @PostMapping("/listAll") + public R listAll() { + List list = playCustomLevelInfoService.selectPlayCustomLevelInfoByPage(); + return R.ok(list); + } + + /** + * 获取顾客等级详细信息 + */ + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playCustomLevelInfoService.selectPlayCustomLevelInfoById(id)); + } + + + /** + * 新增顾客等级 + */ + @Log(title = "店员等级", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayCustomLevelAddVo vo) { + PlayCustomLevelInfoEntity entity = ConvertUtil.entityToVo(vo, PlayCustomLevelInfoEntity.class); + int level = playCustomLevelInfoService.selectMaxLevel(); + entity.setLevel(level + 1); + boolean success = playCustomLevelInfoService.create(entity); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + + /** + * 修改顾客等级 + */ + @Log(title = "顾客等级", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update") + public R update(@RequestBody PlayCustomLevelEditVo vo) { + if (playCustomLevelInfoService.selectPlayCustomLevelInfoById(vo.getId()) == null) { + throw new CustomException("对象不存在"); + } + PlayCustomLevelInfoEntity entity = ConvertUtil.entityToVo(vo, PlayCustomLevelInfoEntity.class); + boolean success = playCustomLevelInfoService.update(entity); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除店员等级 + */ + @Log(title = "店员等级", businessType = BusinessType.DELETE) + @DeleteMapping("delMaxLevel") + public R remove() { + int level = playCustomLevelInfoService.selectMaxLevel(); + if (level <= 1) { + throw new CustomException("最后一级,不允许删除"); + } + playCustomLevelInfoService.delMaxLevelByLevel(level); + return R.ok(); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java index 29dc26a..1f44038 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java @@ -1,42 +1,34 @@ package com.starry.admin.modules.custom.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.module.vo.PlayCustomUserStateEditVo; import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import com.starry.common.annotation.Log; import com.starry.common.enums.BusinessType; import com.starry.common.result.R; - - -import com.starry.common.annotation.Log; -import org.springframework.security.access.prepost.PreAuthorize; +import com.starry.common.utils.ConvertUtil; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - /** * 顾客Controller * * @author admin - * @since 2024-04-08 + * @since 2024-04-08 */ @RestController -@RequestMapping("/play/info") +@RequestMapping("/custom/user") public class PlayCustomUserInfoController { @Resource private IPlayCustomUserInfoService playCustomUserInfoService; -/** - * 查询顾客列表 - */ -@PreAuthorize("@customSs.hasPermission('play:info:list')") -@GetMapping("/list") + /** + * 查询顾客列表 + */ + @GetMapping("/list") public R list(PlayCustomUserInfoEntity playCustomUserInfo) { IPage list = playCustomUserInfoService.selectPlayCustomUserInfoByPage(playCustomUserInfo); return R.ok(list); @@ -45,7 +37,6 @@ public class PlayCustomUserInfoController { /** * 获取顾客详细信息 */ - @PreAuthorize("@customSs.hasPermission('play:info:query')") @GetMapping(value = "/{id}") public R getInfo(@PathVariable("id") String id) { return R.ok(playCustomUserInfoService.selectById(id)); @@ -54,7 +45,6 @@ public class PlayCustomUserInfoController { /** * 新增顾客 */ - @PreAuthorize("@customSs.hasPermission('play:info:create')") @Log(title = "顾客", businessType = BusinessType.INSERT) @PostMapping("/create") public R create(@RequestBody PlayCustomUserInfoEntity playCustomUserInfo) { @@ -65,10 +55,23 @@ public class PlayCustomUserInfoController { return R.error("添加失败"); } + /** + * 修改顾客状态 + */ + @Log(title = "顾客", businessType = BusinessType.UPDATE) + @PostMapping(value = "/updateState") + public R updateState(@Validated @RequestBody PlayCustomUserStateEditVo vo) { + PlayCustomUserInfoEntity entity = ConvertUtil.entityToVo(vo, PlayCustomUserInfoEntity.class); + boolean success = playCustomUserInfoService.update(entity); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + /** * 修改顾客 */ - @PreAuthorize("@customSs.hasPermission('play:info:edit')") @Log(title = "顾客", businessType = BusinessType.UPDATE) @PostMapping(value = "/update/{id}") public R update(@PathVariable String id, @RequestBody PlayCustomUserInfoEntity playCustomUserInfo) { @@ -83,7 +86,6 @@ public class PlayCustomUserInfoController { /** * 删除顾客 */ - @PreAuthorize("@customSs.hasPermission('play:info:remove')") @Log(title = "顾客", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@PathVariable String[] ids) { diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/mapper/PlayCustomLevelInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/custom/mapper/PlayCustomLevelInfoMapper.java new file mode 100644 index 0000000..9199484 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/mapper/PlayCustomLevelInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.custom.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.custom.module.entity.PlayCustomLevelInfoEntity; + +/** + * 顾客等级Mapper接口 + * + * @author admin + * @since 2024-05-04 + */ +public interface PlayCustomLevelInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomLevelInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomLevelInfoEntity.java new file mode 100644 index 0000000..7279504 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomLevelInfoEntity.java @@ -0,0 +1,56 @@ +package com.starry.admin.modules.custom.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 顾客等级对象 play_custom_level_info + * + * @author admin + * @since 2024-05-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_custom_level_info") +public class PlayCustomLevelInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 等级名称 + */ + private String name; + + /** + * 等级数字(排序字段) + */ + private Integer level; + + /** + * 上一级消费金额 + */ + private String consumptionAmount; + + /** + * 满减比例 + */ + private Integer discount; + + /** + * 头像框地址 + */ + private String avatarFrameAddress; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java index 212a6cf..5657b53 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java @@ -6,6 +6,7 @@ import com.starry.common.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; import java.util.Date; /** @@ -41,12 +42,12 @@ public class PlayCustomUserInfoEntity extends BaseEntity { + + + /** + * 获取新增顾客时,默认最低等级ID + * + * @return PlayCustomLevelInfoEntity + */ + PlayCustomLevelInfoEntity getDefaultLevel(); + + /** + * 查询顾客等级列表 + * + * @return 顾客等级集合 + */ + List selectAll(); + + /** + * 查询顾客等级 + * + * @param id 顾客等级主键 + * @return 顾客等级 + */ + PlayCustomLevelInfoEntity selectPlayCustomLevelInfoById(String id); + + /** + * 查询顾客等级列表 + * + * @return 顾客等级集合 + */ + List selectPlayCustomLevelInfoByPage(); + + /** + * 新增顾客等级 + * + * @param playCustomLevelInfo 顾客等级 + * @return 结果 + */ + boolean create(PlayCustomLevelInfoEntity playCustomLevelInfo); + + /** + * 修改顾客等级 + * + * @param playCustomLevelInfo 顾客等级 + * @return 结果 + */ + boolean update(PlayCustomLevelInfoEntity playCustomLevelInfo); + + /** + * 批量删除顾客等级 + * + * @param ids 需要删除的顾客等级主键集合 + * @return 结果 + */ + int deletePlayCustomLevelInfoByIds(String[] ids); + + /** + * 删除顾客等级信息 + * + * @param id 顾客等级主键 + * @return 结果 + */ + int deletePlayCustomLevelInfoById(String id); + + /** + * 查询最大等级 + * + * @return 最大等级 + */ + int selectMaxLevel(); + + + /** + * 删除最大等级 + */ + void delMaxLevelByLevel(Integer level); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java index ea65c0b..a5bba01 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import java.math.BigDecimal; + /** * 顾客Service接口 * @@ -21,7 +23,6 @@ public interface IPlayCustomUserInfoService extends IService implements IPlayCustomLevelInfoService { + @Resource + private PlayCustomLevelInfoMapper playCustomLevelInfoMapper; + + + @Override + public PlayCustomLevelInfoEntity getDefaultLevel() { + List list = this.selectAll(); + if (list != null && !list.isEmpty()) { + return list.get(0); + } + throw new CustomException("系统错误,等级数据未初始化"); + } + + @Override + public List selectAll() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(PlayCustomLevelInfoEntity::getLevel); + return this.baseMapper.selectList(lambdaQueryWrapper); + } + + + /** + * 查询顾客等级 + * + * @param id 顾客等级主键 + * @return 顾客等级 + */ + @Override + public PlayCustomLevelInfoEntity selectPlayCustomLevelInfoById(String id) { + return this.baseMapper.selectById(id); + } + + /** + * 查询顾客等级列表 + * + * @return 顾客等级 + */ + @Override + public List selectPlayCustomLevelInfoByPage() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(PlayCustomLevelInfoEntity::getLevel); + return this.baseMapper.selectList(lambdaQueryWrapper); + } + + /** + * 新增顾客等级 + * + * @param playCustomLevelInfo 顾客等级 + * @return 结果 + */ + @Override + public boolean create(PlayCustomLevelInfoEntity playCustomLevelInfo) { + if (StrUtil.isBlankIfStr(playCustomLevelInfo.getId())) { + playCustomLevelInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playCustomLevelInfo); + } + + /** + * 修改顾客等级 + * + * @param playCustomLevelInfo 顾客等级 + * @return 结果 + */ + @Override + public boolean update(PlayCustomLevelInfoEntity playCustomLevelInfo) { + return updateById(playCustomLevelInfo); + } + + /** + * 批量删除顾客等级 + * + * @param ids 需要删除的顾客等级主键 + * @return 结果 + */ + @Override + public int deletePlayCustomLevelInfoByIds(String[] ids) { + return playCustomLevelInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除顾客等级信息 + * + * @param id 顾客等级主键 + * @return 结果 + */ + @Override + public int deletePlayCustomLevelInfoById(String id) { + return playCustomLevelInfoMapper.deleteById(id); + } + + @Override + public int selectMaxLevel() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("max(level) as level "); + PlayCustomLevelInfoEntity entity = this.baseMapper.selectOne(queryWrapper); + return entity == null ? 0 : entity.getLevel(); + } + + @Override + public void delMaxLevelByLevel(Integer level) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(PlayCustomLevelInfoEntity::getLevel, level); + this.baseMapper.delete(queryWrapper); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java index 52503ca..268df00 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java @@ -12,6 +12,7 @@ import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.Arrays; /** @@ -32,7 +33,6 @@ public class PlayCustomUserInfoServiceImpl extends ServiceImpl list = playCustomFollowInfoService.selectPlayCustomFollowInfoByPage(playCustomFollowInfo); + return R.ok(list); + } + + /** + * 获取顾客关注陪玩信息详细信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:query')") + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playCustomFollowInfoService.selectPlayCustomFollowInfoById(id)); + } + + /** + * 新增顾客关注陪玩信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:create')") + @Log(title = "顾客关注陪玩信息", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayCustomFollowInfoEntity playCustomFollowInfo) { + boolean success = playCustomFollowInfoService.create(playCustomFollowInfo); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + /** + * 修改顾客关注陪玩信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:edit')") + @Log(title = "顾客关注陪玩信息", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update/{id}") + public R update(@PathVariable String id, @RequestBody PlayCustomFollowInfoEntity playCustomFollowInfo) { + playCustomFollowInfo.setId(id); + boolean success = playCustomFollowInfoService.update(playCustomFollowInfo); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除顾客关注陪玩信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:remove')") + @Log(title = "顾客关注陪玩信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + return R.ok(playCustomFollowInfoService.deletePlayCustomFollowInfoByIds(ids)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/follow/mapper/PlayCustomFollowInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/follow/mapper/PlayCustomFollowInfoMapper.java new file mode 100644 index 0000000..ddd2a81 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/follow/mapper/PlayCustomFollowInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.follow.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.follow.module.entity.PlayCustomFollowInfoEntity; + +/** + * 顾客关注陪玩信息Mapper接口 + * + * @author admin + * @since 2024-04-30 + */ +public interface PlayCustomFollowInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/follow/module/entity/PlayCustomFollowInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/follow/module/entity/PlayCustomFollowInfoEntity.java new file mode 100644 index 0000000..8fa6bd7 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/follow/module/entity/PlayCustomFollowInfoEntity.java @@ -0,0 +1,57 @@ +package com.starry.admin.modules.follow.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 顾客关注陪玩信息对象 play_custom_follow_info + * + * @author admin + * @since 2024-04-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_custom_follow_info") +public class PlayCustomFollowInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 顾客ID + */ + private String customUserId; + + /** + * 陪玩ID + */ + private String clerkUserId; + + /** + * 关注时间 + */ + private Date followTime; + + /** + * 取消关注时间 + */ + private Date unfollowTime; + + /** + * 关注状态[0:未关注,1:已关注] + */ + private String followState; + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/follow/service/IPlayCustomFollowInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/follow/service/IPlayCustomFollowInfoService.java new file mode 100644 index 0000000..b2519ca --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/follow/service/IPlayCustomFollowInfoService.java @@ -0,0 +1,79 @@ +package com.starry.admin.modules.follow.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.follow.module.entity.PlayCustomFollowInfoEntity; + +/** + * 顾客关注陪玩信息Service接口 + * + * @author admin + * @since 2024-04-30 + */ +public interface IPlayCustomFollowInfoService extends IService { + /** + * 查询顾客关注陪玩信息 + * + * @param id 顾客关注陪玩信息主键 + * @return 顾客关注陪玩信息 + */ + PlayCustomFollowInfoEntity selectPlayCustomFollowInfoById(String id); + + /** + * 修改关注状态 + * + * @param customUserId 顾客ID + * @param clarkUserId 陪玩ID + * @return 关注状态[0:未关注,1:已关注] + */ + String queryFollowState(String customUserId, String clarkUserId); + + /** + * 修改关注状态 + * + * @param customUserId 顾客ID + * @param clarkUserId 陪玩ID + * @param followState 关注状态[0:未关注,1:已关注] + */ + void updateFollowState(String customUserId, String clarkUserId, String followState); + + /** + * 查询顾客关注陪玩信息列表 + * + * @param playCustomFollowInfo 顾客关注陪玩信息 + * @return 顾客关注陪玩信息集合 + */ + IPage selectPlayCustomFollowInfoByPage(PlayCustomFollowInfoEntity playCustomFollowInfo); + + /** + * 新增顾客关注陪玩信息 + * + * @param playCustomFollowInfo 顾客关注陪玩信息 + * @return 结果 + */ + boolean create(PlayCustomFollowInfoEntity playCustomFollowInfo); + + /** + * 修改顾客关注陪玩信息 + * + * @param playCustomFollowInfo 顾客关注陪玩信息 + * @return 结果 + */ + boolean update(PlayCustomFollowInfoEntity playCustomFollowInfo); + + /** + * 批量删除顾客关注陪玩信息 + * + * @param ids 需要删除的顾客关注陪玩信息主键集合 + * @return 结果 + */ + int deletePlayCustomFollowInfoByIds(String[] ids); + + /** + * 删除顾客关注陪玩信息信息 + * + * @param id 顾客关注陪玩信息主键 + * @return 结果 + */ + int deletePlayCustomFollowInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/follow/service/impl/PlayCustomFollowInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/follow/service/impl/PlayCustomFollowInfoServiceImpl.java new file mode 100644 index 0000000..63fda85 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/follow/service/impl/PlayCustomFollowInfoServiceImpl.java @@ -0,0 +1,127 @@ +package com.starry.admin.modules.follow.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.starry.admin.modules.follow.mapper.PlayCustomFollowInfoMapper; +import com.starry.admin.modules.follow.module.entity.PlayCustomFollowInfoEntity; +import com.starry.admin.modules.follow.service.IPlayCustomFollowInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Date; + +/** + * 顾客关注陪玩信息Service业务层处理 + * + * @author admin + * @since 2024-04-30 + */ +@Service +public class PlayCustomFollowInfoServiceImpl extends ServiceImpl implements IPlayCustomFollowInfoService { + @Resource + private PlayCustomFollowInfoMapper playCustomFollowInfoMapper; + + /** + * 查询顾客关注陪玩信息 + * + * @param id 顾客关注陪玩信息主键 + * @return 顾客关注陪玩信息 + */ + @Override + public PlayCustomFollowInfoEntity selectPlayCustomFollowInfoById(String id) { + return this.baseMapper.selectById(id); + } + + + @Override + public String queryFollowState(String customUserId, String clarkUserId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayCustomFollowInfoEntity::getClerkUserId, clarkUserId); + lambdaQueryWrapper.eq(PlayCustomFollowInfoEntity::getCustomUserId, customUserId); + PlayCustomFollowInfoEntity entity = this.baseMapper.selectOne(lambdaQueryWrapper); + return entity == null ? "0" : entity.getFollowState(); + } + + @Override + public void updateFollowState(String customUserId, String clarkUserId, String followState) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayCustomFollowInfoEntity::getClerkUserId, clarkUserId); + lambdaQueryWrapper.eq(PlayCustomFollowInfoEntity::getCustomUserId, customUserId); + PlayCustomFollowInfoEntity entity = this.baseMapper.selectOne(lambdaQueryWrapper); + if (entity == null) { + entity = new PlayCustomFollowInfoEntity(); + entity.setCustomUserId(customUserId); + entity.setFollowState(followState); + entity.setClerkUserId(clarkUserId); + entity.setFollowTime(new Date()); + this.baseMapper.insert(entity); + } else { + entity.setFollowState(followState); + this.baseMapper.updateById(entity); + } + } + + /** + * 查询顾客关注陪玩信息列表 + * + * @param playCustomFollowInfo 顾客关注陪玩信息 + * @return 顾客关注陪玩信息 + */ + @Override + public IPage selectPlayCustomFollowInfoByPage(PlayCustomFollowInfoEntity playCustomFollowInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); + } + + /** + * 新增顾客关注陪玩信息 + * + * @param playCustomFollowInfo 顾客关注陪玩信息 + * @return 结果 + */ + @Override + public boolean create(PlayCustomFollowInfoEntity playCustomFollowInfo) { + if (StrUtil.isBlankIfStr(playCustomFollowInfo.getId())) { + playCustomFollowInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playCustomFollowInfo); + } + + /** + * 修改顾客关注陪玩信息 + * + * @param playCustomFollowInfo 顾客关注陪玩信息 + * @return 结果 + */ + @Override + public boolean update(PlayCustomFollowInfoEntity playCustomFollowInfo) { + return updateById(playCustomFollowInfo); + } + + /** + * 批量删除顾客关注陪玩信息 + * + * @param ids 需要删除的顾客关注陪玩信息主键 + * @return 结果 + */ + @Override + public int deletePlayCustomFollowInfoByIds(String[] ids) { + return playCustomFollowInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除顾客关注陪玩信息信息 + * + * @param id 顾客关注陪玩信息主键 + * @return 结果 + */ + @Override + public int deletePlayCustomFollowInfoById(String id) { + return playCustomFollowInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/gift/controller/PlayGiftInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/gift/controller/PlayGiftInfoController.java new file mode 100644 index 0000000..a8df0af --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/gift/controller/PlayGiftInfoController.java @@ -0,0 +1,83 @@ +package com.starry.admin.modules.gift.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.starry.admin.modules.gift.module.entity.PlayGiftInfoEntity; +import com.starry.admin.modules.gift.service.IPlayGiftInfoService; +import com.starry.common.annotation.Log; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 礼物Controller + * + * @author admin + * @since 2024-04-25 + */ +@RestController +@RequestMapping("/play/giff") +public class PlayGiftInfoController { + @Resource + private IPlayGiftInfoService playGiftInfoService; + + /** + * 查询礼物列表 + */ + @PreAuthorize("@customSs.hasPermission('play:info:list')") + @GetMapping("/list") + public R list(PlayGiftInfoEntity playGiftInfo) { + IPage list = playGiftInfoService.selectPlayGiftInfoByPage(playGiftInfo); + return R.ok(list); + } + + /** + * 获取礼物详细信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:query')") + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playGiftInfoService.selectPlayGiftInfoById(id)); + } + + /** + * 新增礼物 + */ + @PreAuthorize("@customSs.hasPermission('play:info:create')") + @Log(title = "礼物", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayGiftInfoEntity playGiftInfo) { + boolean success = playGiftInfoService.create(playGiftInfo); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + /** + * 修改礼物 + */ + @PreAuthorize("@customSs.hasPermission('play:info:edit')") + @Log(title = "礼物", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update/{id}") + public R update(@PathVariable String id, @RequestBody PlayGiftInfoEntity playGiftInfo) { + playGiftInfo.setId(id); + boolean success = playGiftInfoService.update(playGiftInfo); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除礼物 + */ + @PreAuthorize("@customSs.hasPermission('play:info:remove')") + @Log(title = "礼物", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + return R.ok(playGiftInfoService.deletePlayGiftInfoByIds(ids)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/gift/mapper/PlayGiftInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/gift/mapper/PlayGiftInfoMapper.java new file mode 100644 index 0000000..d6017d9 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/gift/mapper/PlayGiftInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.gift.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.gift.module.entity.PlayGiftInfoEntity; + +/** + * 礼物Mapper接口 + * + * @author admin + * @since 2024-04-25 + */ +public interface PlayGiftInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/gift/module/entity/PlayGiftInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/gift/module/entity/PlayGiftInfoEntity.java new file mode 100644 index 0000000..0de2858 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/gift/module/entity/PlayGiftInfoEntity.java @@ -0,0 +1,78 @@ +package com.starry.admin.modules.gift.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 礼物对象 play_gift_info + * + * @author admin + * @since 2024-04-25 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_gift_info") +public class PlayGiftInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 礼物名称 + */ + private String name; + + /** + * 礼物类型(0:盲盒,1:普通礼物) + */ + private String type; + + /** + * 礼物图片地址 + */ + private String url; + + /** + * 单价 + */ + private BigDecimal price; + + /** + * 价格单位 + */ + private String unit; + + /** + * 状态(0:正常,1:下架) + */ + private String state; + + /** + * 上架时间 + */ + private Date listingTime; + + /** + * 下架时间 + */ + private Date delintingTime; + + /** + * 备注 + */ + private String remark; + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/gift/service/IPlayGiftInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/gift/service/IPlayGiftInfoService.java new file mode 100644 index 0000000..51b8b7b --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/gift/service/IPlayGiftInfoService.java @@ -0,0 +1,73 @@ +package com.starry.admin.modules.gift.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.gift.module.entity.PlayGiftInfoEntity; + +import java.util.List; + +/** + * 礼物Service接口 + * + * @author admin + * @since 2024-04-25 + */ +public interface IPlayGiftInfoService extends IService { + /** + * 查询礼物 + * + * @param id 礼物主键 + * @return 礼物 + */ + PlayGiftInfoEntity selectPlayGiftInfoById(String id); + + + /** + * 查询所有礼物 + * + * @return List + * @author admin + * @since 2024/4/25 15:56 + **/ + List listByAll(); + + /** + * 查询礼物列表 + * + * @param playGiftInfo 礼物 + * @return 礼物集合 + */ + IPage selectPlayGiftInfoByPage(PlayGiftInfoEntity playGiftInfo); + + /** + * 新增礼物 + * + * @param playGiftInfo 礼物 + * @return 结果 + */ + boolean create(PlayGiftInfoEntity playGiftInfo); + + /** + * 修改礼物 + * + * @param playGiftInfo 礼物 + * @return 结果 + */ + boolean update(PlayGiftInfoEntity playGiftInfo); + + /** + * 批量删除礼物 + * + * @param ids 需要删除的礼物主键集合 + * @return 结果 + */ + int deletePlayGiftInfoByIds(String[] ids); + + /** + * 删除礼物信息 + * + * @param id礼物主键 + * @return 结果 + */ + int deletePlayGiftInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/gift/service/impl/PlayGiftInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/gift/service/impl/PlayGiftInfoServiceImpl.java new file mode 100644 index 0000000..2e13f08 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/gift/service/impl/PlayGiftInfoServiceImpl.java @@ -0,0 +1,104 @@ +package com.starry.admin.modules.gift.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.starry.admin.modules.gift.mapper.PlayGiftInfoMapper; +import com.starry.admin.modules.gift.module.entity.PlayGiftInfoEntity; +import com.starry.admin.modules.gift.service.IPlayGiftInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + * 礼物Service业务层处理 + * + * @author admin + * @since 2024-04-25 + */ +@Service +public class PlayGiftInfoServiceImpl extends ServiceImpl implements IPlayGiftInfoService { + @Resource + private PlayGiftInfoMapper playGiftInfoMapper; + + /** + * 查询礼物 + * + * @param id 礼物主键 + * @return 礼物 + */ + @Override + public PlayGiftInfoEntity selectPlayGiftInfoById(String id) { + return this.baseMapper.selectById(id); + } + + + @Override + public List listByAll() { + return this.baseMapper.selectList(new LambdaQueryWrapper<>()); + } + + /** + * 查询礼物列表 + * + * @param playGiftInfo 礼物 + * @return 礼物 + */ + @Override + public IPage selectPlayGiftInfoByPage(PlayGiftInfoEntity playGiftInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper()); + } + + /** + * 新增礼物 + * + * @param playGiftInfo 礼物 + * @return 结果 + */ + @Override + public boolean create(PlayGiftInfoEntity playGiftInfo) { + if (StrUtil.isBlankIfStr(playGiftInfo.getId())) { + playGiftInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playGiftInfo); + } + + /** + * 修改礼物 + * + * @param playGiftInfo 礼物 + * @return 结果 + */ + @Override + public boolean update(PlayGiftInfoEntity playGiftInfo) { + return updateById(playGiftInfo); + } + + /** + * 批量删除礼物 + * + * @param ids 需要删除的礼物主键 + * @return 结果 + */ + @Override + public int deletePlayGiftInfoByIds(String[] ids) { + return playGiftInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除礼物信息 + * + * @param id 礼物主键 + * @return 结果 + */ + @Override + public int deletePlayGiftInfoById(String id) { + return playGiftInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/controller/OrderInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/order/controller/PlayOrderInfoController.java similarity index 70% rename from play-admin/src/main/java/com/starry/admin/modules/order/controller/OrderInfoController.java rename to play-admin/src/main/java/com/starry/admin/modules/order/controller/PlayOrderInfoController.java index df2d63d..8010124 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/controller/OrderInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/controller/PlayOrderInfoController.java @@ -4,13 +4,9 @@ import cn.hutool.core.util.IdUtil; import com.starry.admin.common.exception.CustomException; import com.starry.admin.modules.coupon.module.entity.CouponInfoEntity; import com.starry.admin.modules.coupon.service.ICouponInfoService; -import com.starry.admin.modules.order.module.entity.OrderDetailsInfoEntity; -import com.starry.admin.modules.order.module.entity.OrderInfoEntity; -import com.starry.admin.modules.order.module.entity.OrderLogInfoEntity; +import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; import com.starry.admin.modules.order.module.vo.*; -import com.starry.admin.modules.order.service.IOrderDetailsInfoService; -import com.starry.admin.modules.order.service.IOrderInfoService; -import com.starry.admin.modules.order.service.IOrderLogInfoService; +import com.starry.admin.modules.order.service.IPlayOrderInfoService; import com.starry.admin.modules.play.module.entity.PlayUserInfoEntity; import com.starry.admin.modules.play.service.IPlayUserInfoService; import com.starry.common.annotation.Log; @@ -21,7 +17,6 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import java.util.Date; /** @@ -31,30 +26,24 @@ import java.util.Date; * @since 2024-03-20 */ @RestController -@RequestMapping("/order/info") -public class OrderInfoController { +@RequestMapping("/order/order/") +public class PlayOrderInfoController { @Resource - private IOrderInfoService orderInfoService; + private IPlayOrderInfoService orderInfoService; - @Resource - private IOrderDetailsInfoService orderDetailsInfoService; @Resource private ICouponInfoService couponInfoService; - @Resource - private IOrderLogInfoService orderLogInfoService; - @Resource private IPlayUserInfoService playUserInfoService; @Log(title = "取消订单", businessType = BusinessType.UPDATE) - @PreAuthorize("@customSs.hasPermission('order/info/cancellation')") public R cancellationOrder(@RequestBody OrderInfoCancellationVo vo) { // 判断操作人是否是陪玩本身 - OrderInfoEntity entity = orderInfoService.selectOrderInfoById(vo.getId()); + PlayOrderInfoEntity entity = orderInfoService.selectOrderInfoById(vo.getId()); // 校验通过 orderInfoService.orderRefund(vo.getId(), "2", null, false); @@ -79,11 +68,11 @@ public class OrderInfoController { // 减少用户余额 // 新增订单记录(订单信息需完善) - OrderInfoEntity entity = ConvertUtil.entityToVo(addVo, OrderInfoEntity.class); + PlayOrderInfoEntity entity = ConvertUtil.entityToVo(addVo, PlayOrderInfoEntity.class); orderInfoService.create(entity); // 新增订单处理日志(打赏单,订单直接完成) - orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "1", new Date())); - orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "4", new Date())); +// orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "1", new Date())); +// orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "4", new Date())); return R.ok("成功"); } @@ -117,20 +106,20 @@ public class OrderInfoController { // throw new CustomException("余额不足,无法下单"); // } - OrderInfoEntity entity = ConvertUtil.entityToVo(addVo, OrderInfoEntity.class); + PlayOrderInfoEntity entity = ConvertUtil.entityToVo(addVo, PlayOrderInfoEntity.class); entity.setId(IdUtil.fastSimpleUUID()); entity.setFirstOrder(true); - entity.setOrderMoney(String.valueOf(orderTotalMoney)); +// entity.setOrderMoney(String.valueOf(orderTotalMoney)); orderInfoService.create(entity); // 记录订单日志 - orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "0", new Date())); +// orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "0", new Date())); // 记录订单详细信息 - orderDetailsInfoService.create(new OrderDetailsInfoEntity(entity.getId(), addVo.getPlayUserId(), "0")); - for (String commodityInfoId : addVo.getCouponIds()) { - orderDetailsInfoService.create(new OrderDetailsInfoEntity(entity.getId(), commodityInfoId, "1")); - } +// orderDetailsInfoService.create(new OrderDetailsInfoEntity(entity.getId(), addVo.getPlayUserId(), "0")); +// for (String commodityInfoId : addVo.getCouponIds()) { +// orderDetailsInfoService.create(new OrderDetailsInfoEntity(entity.getId(), commodityInfoId, "1")); +// } // 发送通知给陪玩,等待陪玩接单 return R.ok("下单成功,等待接单"); @@ -140,7 +129,6 @@ public class OrderInfoController { /** * 分页查询订单列表 */ - @PreAuthorize("@customSs.hasPermission('order/info/list')") @GetMapping("/list") public R list(OrderInfoQueryVo vo) { return R.ok(orderInfoService.selectOrderInfoList(vo)); @@ -150,7 +138,6 @@ public class OrderInfoController { /** * 根据ID查询订单 */ - @PreAuthorize("@customSs.hasPermission('order/info/query')") @GetMapping(value = "/{id}") public R getInfo(@PathVariable("id") String id) { return R.ok(orderInfoService.selectOrderInfoById(id)); @@ -160,10 +147,9 @@ public class OrderInfoController { /** * 根据ID修改订单信息 */ - @PreAuthorize("@customSs.hasPermission('order/info/edit')") @Log(title = "修改普通订单", businessType = BusinessType.UPDATE) @PostMapping(value = "/update/{id}") - public R update(@PathVariable String id, @RequestBody OrderInfoEntity orderInfoEntity) { + public R update(@PathVariable String id, @RequestBody PlayOrderInfoEntity orderInfoEntity) { orderInfoEntity.setId(id); boolean success = orderInfoService.update(orderInfoEntity); if (success) { @@ -175,7 +161,7 @@ public class OrderInfoController { /** * 根据ID进行订单退款 */ - @PreAuthorize("@customSs.hasPermission('order/info/edit')") + @Log(title = "用户发起订单退款申请", businessType = BusinessType.UPDATE) @PostMapping(value = "/refund/{id}") public R refund(@RequestBody OrderInfoRefundVo vo) { @@ -187,7 +173,6 @@ public class OrderInfoController { /** * 删除订单 */ - @PreAuthorize("@customSs.hasPermission('order/info/remove')") @Log(title = "删除订单", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@PathVariable String[] ids) { diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/controller/PlayOrderRewardInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/order/controller/PlayOrderRewardInfoController.java new file mode 100644 index 0000000..c019158 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/order/controller/PlayOrderRewardInfoController.java @@ -0,0 +1,42 @@ +package com.starry.admin.modules.order.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.starry.admin.modules.order.module.vo.PlayOrderRewardQueryVo; +import com.starry.admin.modules.order.module.vo.PlayOrderRewardReturnVo; +import com.starry.admin.modules.order.service.IPlayOrderInfoService; +import com.starry.common.annotation.Log; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + + +/** + * 打赏订单 + * + * @author admin + * @since 2024-03-20 + */ +@RestController +@RequestMapping("/order/reward/") +public class PlayOrderRewardInfoController { + + + + @Resource + private IPlayOrderInfoService orderInfoService; + + + @Log(title = "查询打赏订单", businessType = BusinessType.INSERT) + @PostMapping("/list") + public R queryRewardOrder(@RequestBody PlayOrderRewardQueryVo vo) { + IPage page = orderInfoService.selectRewardOrderInfoByPage(vo); + return R.ok(page); + } + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderDetailsInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderDetailsInfoMapper.java deleted file mode 100644 index fe3ccac..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderDetailsInfoMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.starry.admin.modules.order.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.starry.admin.modules.order.module.entity.OrderDetailsInfoEntity; - -import java.util.List; - -/** - * 订单详细Mapper接口 - * - * @author admin - * @since 2024-03-20 - */ -public interface OrderDetailsInfoMapper extends BaseMapper { - /** - * 查询订单详细 - * - * @param id 订单详细主键 - * @return 订单详细 - */ - OrderDetailsInfoEntity selectOrderDetailsInfoById(String id); - - /** - * 查询订单详细列表 - * - * @param orderDetailsInfo 订单详细 - * @return 订单详细集合 - */ - List selectOrderDetailsInfoList(OrderDetailsInfoEntity orderDetailsInfo); - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderInfoMapper.java deleted file mode 100644 index 9deabff..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderInfoMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.starry.admin.modules.order.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.starry.admin.modules.order.module.entity.OrderInfoEntity; - -import java.util.List; - -/** - * 订单Mapper接口 - * - * @author admin - * @since 2024-03-20 - */ -public interface OrderInfoMapper extends BaseMapper { - /** - * 查询订单 - * - * @param id 订单主键 - * @return 订单 - */ - OrderInfoEntity selectOrderInfoById(String id); - - /** - * 查询订单列表 - * - * @param orderInfoEntity 订单 - * @return 订单集合 - */ - List selectOrderInfoList(OrderInfoEntity orderInfoEntity); - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderLogInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderLogInfoMapper.java deleted file mode 100644 index 40474db..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderLogInfoMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.starry.admin.modules.order.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.starry.admin.modules.order.module.entity.OrderLogInfoEntity; - -/** - * 订单日志Mapper接口 - * - * @author admin - * @since 2024-03-22 - */ -public interface OrderLogInfoMapper extends BaseMapper { - - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/PlayOrderInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/order/mapper/PlayOrderInfoMapper.java new file mode 100644 index 0000000..0638f5b --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/order/mapper/PlayOrderInfoMapper.java @@ -0,0 +1,14 @@ +package com.starry.admin.modules.order.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; + +/** + * 订单Mapper接口 + * + * @author admin + * @since 2024-03-20 + */ +public interface PlayOrderInfoMapper extends MPJBaseMapper { + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderDetailsInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderDetailsInfoEntity.java deleted file mode 100644 index f511b4e..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderDetailsInfoEntity.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.starry.admin.modules.order.module.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.starry.common.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 订单详细对象 order_details_info - * - * @author admin - * @since 2024-03-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("order_details_info") -public class OrderDetailsInfoEntity extends BaseEntity { - - - /** - * UUID - */ - private String id; - - /** - * 订单ID - */ - private String orderId; - - /** - * 商品ID(陪玩用户ID or 优惠券) - */ - private String commodityId; - - /** - * 商品类型【0:1】 - * 0:服务 - * 1:优惠券 - */ - private String commodityType; - - /** - * 备注 - */ - private String remake; - - - public OrderDetailsInfoEntity(String orderId, String commodityId, String commodityType) { - this.orderId = orderId; - this.commodityId = commodityId; - this.commodityType = commodityType; - } -} - diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderLogInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderLogInfoEntity.java deleted file mode 100644 index c8790dc..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderLogInfoEntity.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.starry.admin.modules.order.module.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.starry.common.domain.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("order_log_info") -public class OrderLogInfoEntity extends BaseEntity { - - - /** - * uuid - */ - private String id; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 订单ID - */ - private String orderId; - - /** - * 操作类型 - * 0:下单 - * 1:审核 - * 2:接单 - * 3:服务 - * 4:退款 - * 4:完成 - * 6:取消 - */ - private String operType; - - /** - * 操作时间 - */ - private Date operTime; - - /** - * 备注 - */ - private String remark; - - - public OrderLogInfoEntity(String orderId, String operType, Date operTime) { - this.orderId = orderId; - this.operType = operType; - this.operTime = operTime; - } -} \ No newline at end of file diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/PlayOrderInfoEntity.java similarity index 55% rename from play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderInfoEntity.java rename to play-admin/src/main/java/com/starry/admin/modules/order/module/entity/PlayOrderInfoEntity.java index ac8c08c..30d111d 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/PlayOrderInfoEntity.java @@ -1,11 +1,16 @@ package com.starry.admin.modules.order.module.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.admin.common.conf.StringTypeHandler; import com.starry.common.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Date; +import java.util.List; /** * 订单对象 order_info @@ -16,8 +21,8 @@ import java.util.Date; @Data @EqualsAndHashCode(callSuper = false) -@TableName("order_info") -public class OrderInfoEntity extends BaseEntity { +@TableName("play_order_info") +public class PlayOrderInfoEntity extends BaseEntity { /** @@ -52,7 +57,7 @@ public class OrderInfoEntity extends BaseEntity { private String placeType; /** - * 是否是首单【0:不是。1:是】 + * 是否是首单【0:不是,1:是】 */ private Boolean firstOrder; @@ -61,16 +66,47 @@ public class OrderInfoEntity extends BaseEntity { */ private String refundType; + /** + * 商品ID + */ + private String commodityId; + + /** + * 商品类型[0:礼物,1:服务] + */ + private String commodityType; + /** + * 商品单价 + */ + private BigDecimal commodityPrice; + + /** + * 商品数量 + */ + private String commodityNumber; + + /** + * 优惠券列表 + */ + @TableField(typeHandler = StringTypeHandler.class) + private List couponIds = new ArrayList<>(); + + /** + * 支付方式,0:余额支付,1:微信支付,2:支付宝支付 + */ + private String payMethod; + + /** * 订单金额 */ - private String orderMoney; + private BigDecimal orderMoney; /** * 订单最终金额 */ - private String finalAmount; + private BigDecimal finalAmount; /** * 下单人 @@ -82,6 +118,11 @@ public class OrderInfoEntity extends BaseEntity { */ private Date purchaserTime; + /** + * 是否需要审核,0:不需要,1:需要 + */ + private String reviewRequired; + /** * 审核人 */ @@ -97,5 +138,21 @@ public class OrderInfoEntity extends BaseEntity { */ private String reviewedRemark; + /** + * 接单人 + */ + private String acceptBy; + + /** + * 接单时间 + */ + private Date acceptTime; + + + /** + * 订单备注 + */ + private String remark; + } \ No newline at end of file diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/PlayOrderRewardQueryVo.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/PlayOrderRewardQueryVo.java new file mode 100644 index 0000000..d4f1b22 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/PlayOrderRewardQueryVo.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.order.module.vo; + + +import com.starry.common.domain.BasePageEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 打赏订单查询对象 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class PlayOrderRewardQueryVo extends BasePageEntity { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/PlayOrderRewardReturnVo.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/PlayOrderRewardReturnVo.java new file mode 100644 index 0000000..68345ef --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/PlayOrderRewardReturnVo.java @@ -0,0 +1,80 @@ +package com.starry.admin.modules.order.module.vo; + + +import lombok.Data; + +import java.util.Date; + +/** + * 打赏订单查询返回信息 + */ +@Data +public class PlayOrderRewardReturnVo { + + /** + * 订单ID + */ + private String id; + + /** + * 用户ID + */ + private String customUserId; + + /** + * 用户昵称 + */ + private String customUserNickname; + + + /** + * 用户头像 + */ + private String customUserAvatar; + + + /** + * 店员ID + */ + private String clerkUserId; + + /** + * 店员昵称 + */ + private String clerkUserNickname; + + /** + * 店员头像 + */ + private String clerkUserAvatar; + + + /** + * 打赏类型 + */ + private String rewardType; + + + /** + * 订单金额 + */ + private String orderMoney; + + + /** + * 支付金额 + */ + private String finalAmount; + + + /** + * 打赏留言 + */ + private String remark; + + /** + * 打赏时间 + */ + private Date purchaserTime; + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderDetailsInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderDetailsInfoService.java deleted file mode 100644 index f0e1638..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderDetailsInfoService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.starry.admin.modules.order.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.starry.admin.modules.order.module.entity.OrderDetailsInfoEntity; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 订单详细Service接口 - * - * @author admin - * @since 2024-03-20 - */ -@Service -public interface IOrderDetailsInfoService extends IService { - /** - * 查询订单详细 - * - * @param id 订单详细主键 - * @return 订单详细 - */ - OrderDetailsInfoEntity selectOrderDetailsInfoById(String id); - - /** - * 查询订单详细列表 - * - * @param orderDetailsInfo 订单详细 - * @return 订单详细集合 - */ - List selectOrderDetailsInfoList(OrderDetailsInfoEntity orderDetailsInfo); - - /** - * 新增订单详细 - * - * @param orderDetailsInfo 订单详细 - * @return 结果 - */ - boolean create(OrderDetailsInfoEntity orderDetailsInfo); - - /** - * 修改订单详细 - * - * @param orderDetailsInfo 订单详细 - * @return 结果 - */ - boolean update(OrderDetailsInfoEntity orderDetailsInfo); - - /** - * 批量删除订单详细 - * - * @param ids 需要删除的订单详细主键集合 - * @return 结果 - */ - int deleteOrderDetailsInfoByIds(String[] ids); - - /** - * 删除订单详细信息 - * - * @param id 订单详细主键 - * @return 结果 - */ - int deleteOrderDetailsInfoById(String id); -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderInfoService.java deleted file mode 100644 index 18e21ee..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderInfoService.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.starry.admin.modules.order.service; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.starry.admin.modules.order.module.entity.OrderInfoEntity; -import com.starry.admin.modules.order.module.vo.OrderInfoQueryVo; -import org.springframework.stereotype.Service; - -/** - * 订单Service接口 - * - * @author admin - * @since 2024-03-20 - */ -@Service -public interface IOrderInfoService extends IService { - /** - * 查询订单 - * - * @param id 订单主键 - * @return 订单 - */ - OrderInfoEntity selectOrderInfoById(String id); - - /** - * 查询订单列表 - * - * @param orderInfoEntity 订单 - * @return 订单集合 - */ - IPage selectOrderInfoList(OrderInfoQueryVo orderInfoEntity); - - /** - * 新增订单 - * - * @param orderInfoEntity 订单 - * @return 结果 - */ - boolean create(OrderInfoEntity orderInfoEntity); - - /** - * 修改订单 - * - * @param orderInfoEntity 订单 - * @return 结果 - */ - boolean update(OrderInfoEntity orderInfoEntity); - - /** - * 批量删除订单 - * - * @param ids 需要删除的订单主键集合 - * @return 结果 - */ - int deleteOrderInfoByIds(String[] ids); - - /** - * 删除订单信息 - * - * @param id 订单主键 - * @return 结果 - */ - int deleteOrderInfoById(String id); - - - /** - * 订单退款 - * - * @param id 订单ID - * @param refundType 退款类型【1:部分退款,2:全部退款】 - * @param refundMoney 退款金额,单位分(仅部分退款有效) - * @param examine 是否需要审核 - */ - void orderRefund(String id, String refundType, String refundMoney, boolean examine); - - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderLogInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderLogInfoService.java deleted file mode 100644 index b916bd8..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderLogInfoService.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.starry.admin.modules.order.service; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.starry.admin.modules.order.module.entity.OrderLogInfoEntity; - -/** - * 订单日志Service接口 - * - * @author admin - * @since 2024-03-22 - */ -public interface IOrderLogInfoService extends IService { - /** - * 查询订单日志 - * - * @param id 订单日志主键 - * @return 订单日志 - */ - OrderLogInfoEntity selectOrderLogInfoById(String id); - - /** - * 查询订单日志列表 - * - * @param orderLogInfo 订单日志 - * @return 订单日志集合 - */ - IPage selectOrderLogInfoByPage(OrderLogInfoEntity orderLogInfo); - - /** - * 新增订单日志 - * - * @param orderLogInfo 订单日志 - * @return 结果 - */ - boolean create(OrderLogInfoEntity orderLogInfo); - - /** - * 修改订单日志 - * - * @param orderLogInfo 订单日志 - * @return 结果 - */ - boolean update(OrderLogInfoEntity orderLogInfo); - - /** - * 批量删除订单日志 - * - * @param ids 需要删除的订单日志主键集合 - * @return 结果 - */ - int deleteOrderLogInfoByIds(String[] ids); - - /** - * 删除订单日志信息 - * - * @param id 订单日志主键 - * @return 结果 - */ - int deleteOrderLogInfoById(String id); -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/IPlayOrderInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/IPlayOrderInfoService.java new file mode 100644 index 0000000..6a8e868 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/order/service/IPlayOrderInfoService.java @@ -0,0 +1,145 @@ +package com.starry.admin.modules.order.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; +import com.starry.admin.modules.order.module.vo.OrderInfoQueryVo; +import com.starry.admin.modules.order.module.vo.PlayOrderRewardQueryVo; +import com.starry.admin.modules.order.module.vo.PlayOrderRewardReturnVo; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * 订单Service接口 + * + * @author admin + * @since 2024-03-20 + */ +@Service +public interface IPlayOrderInfoService extends IService { + + + /** + * 新增充值单 + * + * @param orderMoney 订单金额 + * @param finalAmount 订单最终金额(支付金额) + * @param purchaserBy 下单人ID + */ + void createRechargeOrder(BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy); + + + /** + * 新增打赏单 + * + * @param orderMoney 订单金额 + * @param finalAmount 订单最终金额(支付金额) + * @param purchaserBy 下单人ID + */ + void createRewardOrder(BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy); + + + /** + * 新增赠送礼物订单 + * + * @param commodityId 商品ID(礼物ID) + * @param commodityPrice 商品单价(礼物单价) + * @param commodityNumber 商品数量(礼物数量) + * @param orderMoney 订单金额 + * @param finalAmount 订单最终金额(支付金额) + * @param purchaserBy 下单人ID + */ + void createGiftOrder(String commodityId, BigDecimal commodityPrice, String commodityNumber, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy); + + + /** + * 新增普通订单 + * + * @param orderStatus 订单状态【0:1:2:3:4:5】 + * * 0:已下单 + * * 1:已审核(退款 或者 提现需要审核,其余不需要) + * * 2:已接单 + * * 3:已开始 + * * 4:已完成 + * * 5:已取消 + * @param placeType 下单类型(0:指定单,1:随机单。2:打赏单) + * @param commodityId 商品ID + * @param commodityPrice 商品单价 + * @param commodityNumber 商品数量 + * @param orderMoney 订单金额 + * @param finalAmount 订单最终金额(支付金额) + * @param purchaserBy 下单人ID + */ + void createOrdinaryOrder(String orderStatus, String placeType, String commodityId, BigDecimal commodityPrice, String commodityNumber, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy); + + + /** + * 分页查询打赏订单 + * + * @param vo 打赏订单查询对象 + * @return 打赏订单 + */ + IPage selectRewardOrderInfoByPage(PlayOrderRewardQueryVo vo); + + /** + * 查询订单 + * + * @param id 订单主键 + * @return 订单 + */ + PlayOrderInfoEntity selectOrderInfoById(String id); + + /** + * 查询订单列表 + * + * @param orderInfoEntity 订单 + * @return 订单集合 + */ + IPage selectOrderInfoList(OrderInfoQueryVo orderInfoEntity); + + /** + * 新增订单 + * + * @param orderInfoEntity 订单 + * @return 结果 + */ + boolean create(PlayOrderInfoEntity orderInfoEntity); + + /** + * 修改订单 + * + * @param orderInfoEntity 订单 + * @return 结果 + */ + boolean update(PlayOrderInfoEntity orderInfoEntity); + + /** + * 批量删除订单 + * + * @param ids 需要删除的订单主键集合 + * @return 结果 + */ + int deleteOrderInfoByIds(String[] ids); + + /** + * 删除订单信息 + * + * @param id 订单主键 + * @return 结果 + */ + int deleteOrderInfoById(String id); + + + /** + * 订单退款 + * + * @param id 订单ID + * @param refundType 退款类型【1:部分退款,2:全部退款】 + * @param refundMoney 退款金额,单位分(仅部分退款有效) + * @param examine 是否需要审核 + */ + void orderRefund(String id, String refundType, String refundMoney, boolean examine); + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderDetailsInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderDetailsInfoServiceImpl.java deleted file mode 100644 index 4b22380..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderDetailsInfoServiceImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.starry.admin.modules.order.service.impl; - -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.modules.order.mapper.OrderDetailsInfoMapper; -import com.starry.admin.modules.order.module.entity.OrderDetailsInfoEntity; -import com.starry.admin.modules.order.service.IOrderDetailsInfoService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; - -/** - * 订单详细Service业务层处理 - * - * @author admin - * @since 2024-03-20 - */ -@Service -public class OrderDetailsInfoServiceImpl extends ServiceImpl implements IOrderDetailsInfoService { - @Resource - private OrderDetailsInfoMapper orderDetailsInfoMapper; - - /** - * 查询订单详细 - * - * @param id 订单详细主键 - * @return 订单详细 - */ - @Override - public OrderDetailsInfoEntity selectOrderDetailsInfoById(String id) { - return orderDetailsInfoMapper.selectOrderDetailsInfoById(id); - } - - /** - * 查询订单详细列表 - * - * @param orderDetailsInfo 订单详细 - * @return 订单详细 - */ - @Override - public List selectOrderDetailsInfoList(OrderDetailsInfoEntity orderDetailsInfo) { - return orderDetailsInfoMapper.selectOrderDetailsInfoList(orderDetailsInfo); - } - - /** - * 新增订单详细 - * - * @param orderDetailsInfo 订单详细 - * @return 结果 - */ - @Override - public boolean create(OrderDetailsInfoEntity orderDetailsInfo) { - if (StrUtil.isBlankIfStr(orderDetailsInfo.getId())) { - orderDetailsInfo.setId(IdUtil.fastSimpleUUID()); - } - return save(orderDetailsInfo); - } - - /** - * 修改订单详细 - * - * @param orderDetailsInfo 订单详细 - * @return 结果 - */ - @Override - public boolean update(OrderDetailsInfoEntity orderDetailsInfo) { - return updateById(orderDetailsInfo); - } - - /** - * 批量删除订单详细 - * - * @param ids 需要删除的订单详细主键 - * @return 结果 - */ - @Override - public int deleteOrderDetailsInfoByIds(String[] ids) { - return orderDetailsInfoMapper.deleteBatchIds(Arrays.asList(ids)); - } - - /** - * 删除订单详细信息 - * - * @param id 订单详细主键 - * @return 结果 - */ - @Override - public int deleteOrderDetailsInfoById(String id) { - return orderDetailsInfoMapper.deleteById(id); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderInfoServiceImpl.java deleted file mode 100644 index f43be4d..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderInfoServiceImpl.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.starry.admin.modules.order.service.impl; - -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.common.exception.CustomException; -import com.starry.admin.modules.order.mapper.OrderInfoMapper; -import com.starry.admin.modules.order.module.entity.OrderInfoEntity; -import com.starry.admin.modules.order.module.entity.OrderLogInfoEntity; -import com.starry.admin.modules.order.module.vo.OrderInfoQueryVo; -import com.starry.admin.modules.order.service.IOrderInfoService; -import com.starry.admin.modules.order.service.IOrderLogInfoService; -import com.starry.admin.modules.play.service.IPlayUserInfoService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Arrays; -import java.util.Date; - -/** - * 订单Service业务层处理 - * - * @author admin - * @since 2024-03-20 - */ -@Service -public class OrderInfoServiceImpl extends ServiceImpl implements IOrderInfoService { - @Resource - private OrderInfoMapper orderInfoMapper; - - @Resource - private IOrderLogInfoService orderLogInfoService; - - @Resource - private IPlayUserInfoService playUserInfoService; - - /** - * 计算退款金额 - * - * @param refundType 退款类型【1:部分退款,2:全部退款】 - * @param refundMoney 退款金额,单位分(仅部分退款有效) - * @param entity 订单信息 - * @return 最终退款金额 - */ - private static long getFinalAmount(String refundType, String refundMoney, OrderInfoEntity entity) { - long finalAmount = 0; - // 部分退款,计算退款金额是否小于订单金额 - if ("1".equals(refundType)) { - // 退款金额 - long refundMoneyLong = Long.getLong(refundMoney); - // 订单金额 - long orderMoney = Long.getLong(entity.getOrderMoney()); - if (refundMoneyLong <= 0) { - throw new CustomException("退款金额必须大于0"); - } - if (orderMoney < refundMoneyLong) { - throw new CustomException("退款金额必须小于订单总金额"); - } - finalAmount = orderMoney - refundMoneyLong; - } - return finalAmount; - } - - /** - * 查询订单 - * - * @param id 订单主键 - * @return 订单 - */ - @Override - public OrderInfoEntity selectOrderInfoById(String id) { - return orderInfoMapper.selectOrderInfoById(id); - } - - /** - * 分页查询订单信息 - * - * @param vo 订单分页查询对象 - * @return 订单分页查询结果 - */ - @Override - public IPage selectOrderInfoList(OrderInfoQueryVo vo) { - Page page = new Page<>(vo.getPageNum(), vo.getPageSize()); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - return this.baseMapper.selectPage(page, queryWrapper); - } - - /** - * 新增订单 - * - * @param orderInfo 订单 - * @return 结果 - */ - @Override - public boolean create(OrderInfoEntity orderInfo) { - if (StrUtil.isBlankIfStr(orderInfo.getId())) { - orderInfo.setId(IdUtil.fastSimpleUUID()); - } - orderInfo.setPurchaserBy("sysadmin"); - orderInfo.setPurchaserTime(new Date()); - orderInfo.setReviewedBy("sysadmin"); - orderInfo.setReviewedTime(new Date()); - return save(orderInfo); - } - - /** - * 修改订单 - * - * @param orderInfo 订单 - * @return 结果 - */ - @Override - public boolean update(OrderInfoEntity orderInfo) { - return updateById(orderInfo); - } - - /** - * 批量删除订单 - * - * @param ids 需要删除的订单主键 - * @return 结果 - */ - @Override - public int deleteOrderInfoByIds(String[] ids) { - return orderInfoMapper.deleteBatchIds(Arrays.asList(ids)); - } - - /** - * 删除订单信息 - * - * @param id 订单主键 - * @return 结果 - */ - @Override - public int deleteOrderInfoById(String id) { - return orderInfoMapper.deleteById(id); - } - - @Override - public void orderRefund(String id, String refundType, String refundMoney, boolean examine) { - OrderInfoEntity entity = this.selectOrderInfoById(id); - if (entity == null) { - throw new CustomException("订单不存在"); - } - if (!"0".equals(entity.getRefundType())) { - throw new CustomException("订单已退款,无法二次退款"); - } - // 最终退款金额 - long finalAmount = getFinalAmount(refundType, refundMoney, entity); - - // 减少陪玩余额 -// playUserInfoService.editAccountBalance(id, String.valueOf(finalAmount), "reduce"); - // 新增用户余额 - - // 修改订单信息 - entity.setFinalAmount(String.valueOf(finalAmount)); - entity.setRefundType(refundType); - entity.setOrderStatus("5"); - this.update(entity); - // 增加订单处理日志 - orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "4", new Date())); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderLogInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderLogInfoServiceImpl.java deleted file mode 100644 index 8fe0127..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderLogInfoServiceImpl.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.starry.admin.modules.order.service.impl; - -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.modules.order.mapper.OrderLogInfoMapper; -import com.starry.admin.modules.order.module.entity.OrderLogInfoEntity; -import com.starry.admin.modules.order.service.IOrderLogInfoService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Arrays; - - -/** - * 订单日志Service业务层处理 - * - * @author admin - * @since 2024-03-22 - */ -@Service -public class OrderLogInfoServiceImpl extends ServiceImpl implements IOrderLogInfoService { - @Resource - private OrderLogInfoMapper orderLogInfoMapper; - - /** - * 查询订单日志 - * - * @param id 订单日志主键 - * @return 订单日志 - */ - @Override - public OrderLogInfoEntity selectOrderLogInfoById(String id) { - return this.baseMapper.selectById(id); - } - - /** - * 查询订单日志列表 - * - * @param orderLogInfo 订单日志 - * @return 订单日志 - */ - @Override - public IPage selectOrderLogInfoByPage(OrderLogInfoEntity orderLogInfo) { - Page page = new Page<>(1, 10); - return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); - } - - /** - * 新增订单日志 - * - * @param orderLogInfo 订单日志 - * @return 结果 - */ - @Override - public boolean create(OrderLogInfoEntity orderLogInfo) { - if (StrUtil.isBlankIfStr(orderLogInfo.getId())) { - orderLogInfo.setId(IdUtil.fastSimpleUUID()); - } - return save(orderLogInfo); - } - - /** - * 修改订单日志 - * - * @param orderLogInfo 订单日志 - * @return 结果 - */ - @Override - public boolean update(OrderLogInfoEntity orderLogInfo) { - return updateById(orderLogInfo); - } - - /** - * 批量删除订单日志 - * - * @param ids 需要删除的订单日志主键 - * @return 结果 - */ - @Override - public int deleteOrderLogInfoByIds(String[] ids) { - return orderLogInfoMapper.deleteBatchIds(Arrays.asList(ids)); - } - - /** - * 删除订单日志信息 - * - * @param id 订单日志主键 - * @return 结果 - */ - @Override - public int deleteOrderLogInfoById(String id) { - return orderLogInfoMapper.deleteById(id); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java new file mode 100644 index 0000000..9c2fd46 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/PlayOrderInfoServiceImpl.java @@ -0,0 +1,246 @@ +package com.starry.admin.modules.order.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.order.mapper.PlayOrderInfoMapper; +import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity; +import com.starry.admin.modules.order.module.vo.OrderInfoQueryVo; +import com.starry.admin.modules.order.module.vo.PlayOrderRewardQueryVo; +import com.starry.admin.modules.order.module.vo.PlayOrderRewardReturnVo; +import com.starry.admin.modules.order.service.IPlayOrderInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Date; + +/** + * 订单Service业务层处理 + * + * @author admin + * @since 2024-03-20 + */ +@Service +public class PlayOrderInfoServiceImpl extends ServiceImpl implements IPlayOrderInfoService { + @Resource + private PlayOrderInfoMapper orderInfoMapper; + + + @Override + public void createRechargeOrder(BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy) { + PlayOrderInfoEntity entity = new PlayOrderInfoEntity(); + entity.setOrderStatus("4"); + entity.setOrderType("0"); + entity.setOrderMoney(orderMoney); + entity.setFinalAmount(finalAmount); + entity.setPurchaserBy(purchaserBy); + this.baseMapper.insert(entity); + } + + /** + * 新增打赏单 + * 打赏订单直接完成 + * + * @param orderMoney 订单金额 + * @param finalAmount 订单最终金额(支付金额) + * @param purchaserBy 下单人ID + */ + @Override + public void createRewardOrder(BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy) { + PlayOrderInfoEntity entity = new PlayOrderInfoEntity(); + entity.setOrderStatus("4"); + entity.setOrderType("2"); + entity.setPlaceType("2"); + entity.setOrderMoney(orderMoney); + entity.setFinalAmount(finalAmount); + entity.setPurchaserBy(purchaserBy); + this.baseMapper.insert(entity); + + } + + @Override + public void createGiftOrder(String commodityId, BigDecimal commodityPrice, String commodityNumber, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy) { + PlayOrderInfoEntity entity = new PlayOrderInfoEntity(); + entity.setOrderStatus("4"); + entity.setOrderType("2"); + entity.setPlaceType("2"); + entity.setCommodityId(commodityId); + entity.setCommodityPrice(commodityPrice); + entity.setCommodityType("0"); + entity.setOrderMoney(orderMoney); + entity.setFinalAmount(finalAmount); + entity.setPurchaserBy(purchaserBy); + this.baseMapper.insert(entity); + } + + @Override + public void createOrdinaryOrder(String orderStatus, String placeType, String commodityId, BigDecimal commodityPrice, String commodityNumber, BigDecimal orderMoney, BigDecimal finalAmount, String purchaserBy) { + PlayOrderInfoEntity entity = new PlayOrderInfoEntity(); + entity.setOrderStatus(orderStatus); + entity.setOrderType("2"); + entity.setPlaceType(placeType); + entity.setCommodityId(commodityId); + entity.setCommodityPrice(commodityPrice); + entity.setCommodityNumber(commodityNumber); + entity.setCommodityType("0"); + entity.setOrderMoney(orderMoney); + entity.setFinalAmount(finalAmount); + entity.setPurchaserBy(purchaserBy); + this.baseMapper.insert(entity); + } + + /** + * 计算退款金额 + * + * @param refundType 退款类型【1:部分退款,2:全部退款】 + * @param refundMoney 退款金额,单位分(仅部分退款有效) + * @param entity 订单信息 + * @return 最终退款金额 + */ + private static long getFinalAmount(String refundType, String refundMoney, PlayOrderInfoEntity entity) { + long finalAmount = 0; +// // 部分退款,计算退款金额是否小于订单金额 +// if ("1".equals(refundType)) { +// // 退款金额 +// long refundMoneyLong = Long.getLong(refundMoney); +// // 订单金额 +// long orderMoney = Long.getLong(entity.getOrderMoney()); +// if (refundMoneyLong <= 0) { +// throw new CustomException("退款金额必须大于0"); +// } +// if (orderMoney < refundMoneyLong) { +// throw new CustomException("退款金额必须小于订单总金额"); +// } +// finalAmount = orderMoney - refundMoneyLong; +// } + return finalAmount; + } + + + @Override + public IPage selectRewardOrderInfoByPage(PlayOrderRewardQueryVo vo) { + MPJLambdaWrapper lambdaQueryWrapper = new MPJLambdaWrapper() + //查询主表全部字段 + .selectAll(PlayOrderInfoEntity.class) + //查询顾客表 + .selectAs(PlayCustomUserInfoEntity::getId, "customUserId").selectAs(PlayCustomUserInfoEntity::getAvatar, "customUserAvatar").selectAs(PlayCustomUserInfoEntity::getNickname, "customUserNickname") + //查询陪玩表 + .selectAs(PlayClerkUserInfoEntity::getId, "clerkUserId").selectAs(PlayClerkUserInfoEntity::getAvatar, "clerkUserAvatar").selectAs(PlayClerkUserInfoEntity::getNickname, "clerkUserNickname") + //子表 + .leftJoin(PlayCustomUserInfoEntity.class, PlayCustomUserInfoEntity::getId, PlayOrderInfoEntity::getPurchaserBy) + .leftJoin(PlayClerkUserInfoEntity.class, PlayClerkUserInfoEntity::getId, PlayOrderInfoEntity::getAcceptBy); + lambdaQueryWrapper.eq(PlayOrderInfoEntity::getPlaceType, "2"); + lambdaQueryWrapper.orderByDesc(PlayOrderInfoEntity::getPurchaserTime); + return this.baseMapper.selectJoinPage(new Page<>(vo.getPageNum(), vo.getPageSize()), PlayOrderRewardReturnVo.class, lambdaQueryWrapper); + + } + + /** + * 查询订单 + * + * @param id 订单主键 + * @return 订单 + */ + @Override + public PlayOrderInfoEntity selectOrderInfoById(String id) { + return orderInfoMapper.selectById(id); + } + + /** + * 分页查询订单信息 + * + * @param vo 订单分页查询对象 + * @return 订单分页查询结果 + */ + @Override + public IPage selectOrderInfoList(OrderInfoQueryVo vo) { + Page page = new Page<>(vo.getPageNum(), vo.getPageSize()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + return this.baseMapper.selectPage(page, queryWrapper); + } + + /** + * 新增订单 + * + * @param orderInfo 订单 + * @return 结果 + */ + @Override + public boolean create(PlayOrderInfoEntity orderInfo) { + if (StrUtil.isBlankIfStr(orderInfo.getId())) { + orderInfo.setId(IdUtil.fastSimpleUUID()); + } + orderInfo.setPurchaserBy("sysadmin"); + orderInfo.setPurchaserTime(new Date()); + orderInfo.setReviewedBy("sysadmin"); + orderInfo.setReviewedTime(new Date()); + return save(orderInfo); + } + + /** + * 修改订单 + * + * @param orderInfo 订单 + * @return 结果 + */ + @Override + public boolean update(PlayOrderInfoEntity orderInfo) { + return updateById(orderInfo); + } + + /** + * 批量删除订单 + * + * @param ids 需要删除的订单主键 + * @return 结果 + */ + @Override + public int deleteOrderInfoByIds(String[] ids) { + return orderInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除订单信息 + * + * @param id 订单主键 + * @return 结果 + */ + @Override + public int deleteOrderInfoById(String id) { + return orderInfoMapper.deleteById(id); + } + + @Override + public void orderRefund(String id, String refundType, String refundMoney, boolean examine) { + PlayOrderInfoEntity entity = this.selectOrderInfoById(id); + if (entity == null) { + throw new CustomException("订单不存在"); + } + if (!"0".equals(entity.getRefundType())) { + throw new CustomException("订单已退款,无法二次退款"); + } + // 最终退款金额 + long finalAmount = getFinalAmount(refundType, refundMoney, entity); + + // 减少陪玩余额 +// playUserInfoService.editAccountBalance(id, String.valueOf(finalAmount), "reduce"); + // 新增用户余额 + + // 修改订单信息 +// entity.setFinalAmount(String.valueOf(finalAmount)); + entity.setRefundType(refundType); + entity.setOrderStatus("5"); + this.update(entity); + // 增加订单处理日志 +// orderLogInfoService.create(new OrderLogInfoEntity(entity.getId(), "4", new Date())); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/platform/controller/SysTenantController.java b/play-admin/src/main/java/com/starry/admin/modules/platform/controller/SysTenantController.java index 27a07bd..f06183a 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/platform/controller/SysTenantController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/platform/controller/SysTenantController.java @@ -10,11 +10,11 @@ import com.starry.common.enums.BusinessType; import com.starry.common.result.R; import com.starry.common.utils.ConvertUtil; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; /** @@ -35,7 +35,7 @@ public class SysTenantController { @PreAuthorize("@customSs.hasPermission('platform:tenant:create')") @Log(title = "租户表", businessType = BusinessType.INSERT) @PostMapping("/create") - public R create(@Valid @RequestBody SysTenantAddVo vo) { + public R create(@Validated @RequestBody SysTenantAddVo vo) { SysTenantEntity entity = ConvertUtil.entityToVo(vo, SysTenantEntity.class); return sysTenantService.addTenant(entity); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/platform/entity/SysTenantEntity.java b/play-admin/src/main/java/com/starry/admin/modules/platform/entity/SysTenantEntity.java index 2c7e9dc..e18714d 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/platform/entity/SysTenantEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/platform/entity/SysTenantEntity.java @@ -116,6 +116,11 @@ public class SysTenantEntity extends BaseEntity { */ private String appId; + /** + * 微信商户ID + */ + private String mchId; + /** * 微信公众号的app secret diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/controller/PlayNoticeInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/play/controller/PlayNoticeInfoController.java index c881251..94b3767 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/play/controller/PlayNoticeInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/play/controller/PlayNoticeInfoController.java @@ -9,10 +9,10 @@ import com.starry.common.enums.BusinessType; import com.starry.common.result.R; import com.starry.common.utils.ConvertUtil; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.validation.Valid; /** * 公告Controller @@ -62,7 +62,7 @@ public class PlayNoticeInfoController { @PreAuthorize("@customSs.hasPermission('play:info:create')") @Log(title = "公告", businessType = BusinessType.INSERT) @PostMapping("/create") - public R create(@Valid @RequestBody PlayNoticeInfoAddVo vo) { + public R create(@Validated @RequestBody PlayNoticeInfoAddVo vo) { PlayNoticeInfoEntity entity = ConvertUtil.entityToVo(vo, PlayNoticeInfoEntity.class); boolean success = playNoticeInfoService.create(entity); if (success) { diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayCommodityInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayCommodityInfoEntity.java index d679d86..f085f97 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayCommodityInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayCommodityInfoEntity.java @@ -5,6 +5,8 @@ import com.starry.common.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + /** * 服务项目对象 play_commodity_info * @@ -45,7 +47,7 @@ public class PlayCommodityInfoEntity extends BaseEntity /** * 服务单价 */ - private String price; + private BigDecimal price; } diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysMenuController.java b/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysMenuController.java index 62251e1..a1363eb 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysMenuController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysMenuController.java @@ -88,6 +88,7 @@ public class SysMenuController { return R.error("修改失败"); } + @ApiOperation("删除菜单") @PreAuthorize("@customSs.hasPermission('system:menu:delete')") @PostMapping(value = "/delete/{id}") diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysRoleController.java b/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysRoleController.java index 8076b78..aa066d8 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysRoleController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/system/controller/SysRoleController.java @@ -20,10 +20,10 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.validation.Valid; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -51,7 +51,7 @@ public class SysRoleController { @ApiOperation("添加角色") @PreAuthorize("@customSs.hasPermission('system:role:create')") @PostMapping("/create") - public R create(@Valid @RequestBody SysRoleAddVo roleAddVo) { + public R create(@Validated @RequestBody SysRoleAddVo roleAddVo) { SysRoleEntity role = new SysRoleEntity(); BeanUtils.copyProperties(roleAddVo, role); if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java index 679c00e..e9d9c9c 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java @@ -44,7 +44,6 @@ public class SysAdministrativeAreaDictInfoServiceImpl extends ServiceImpl selectTree(String level) { - List result = new ArrayList<>(); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.le(SysAdministrativeAreaDictInfoEntity::getLevel, level); List list = this.baseMapper.selectList(lambdaQueryWrapper); diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java index e56e251..5cb5c81 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxClerkController.java @@ -20,21 +20,19 @@ import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; import com.starry.admin.modules.clear.service.impl.PlayClerkDataReviewInfoServiceImpl; import com.starry.admin.modules.clear.service.impl.PlayClerkUserInfoServiceImpl; import com.starry.admin.modules.weichat.entity.*; +import com.starry.admin.modules.weichat.service.WxCustomUserService; import com.starry.admin.utils.SecurityUtils; import com.starry.common.redis.RedisCache; import com.starry.common.result.R; import com.starry.common.utils.ConvertUtil; import com.starry.common.utils.VerificationCodeUtils; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.validation.Valid; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; /** * @author admin @@ -67,6 +65,9 @@ public class WxClerkController { @Resource private IPlayClerkCommodityService playClerkCommodityService; + @Resource + private WxCustomUserService customUserService; + @ClerkUserLogin @GetMapping("/user/queryById") @@ -94,7 +95,7 @@ public class WxClerkController { @ClerkUserLogin @PostMapping("/user/sendCode") - public R sendCode(@Valid @RequestBody PlayClerkUserSendCodeVo vo) { + public R sendCode(@Validated @RequestBody PlayClerkUserSendCodeVo vo) { String codeKey = "login_codes:" + SecurityUtils.getTenantId() + "_" + SecureUtil.md5(vo.getAreaCode() + vo.getPhone()); String code = VerificationCodeUtils.getVerificationCode(4); redisCache.setCacheObject(codeKey, code, 5L, TimeUnit.MINUTES); @@ -104,7 +105,7 @@ public class WxClerkController { @ClerkUserLogin @PostMapping("/user/bindCode") - public R bindCode(@Valid @RequestBody PlayClerkUserBindCodeVo vo) { + public R bindCode(@Validated @RequestBody PlayClerkUserBindCodeVo vo) { String codeKey = "login_codes:" + SecurityUtils.getTenantId() + "_" + SecureUtil.md5(vo.getAreaCode() + vo.getPhone()); String code = redisCache.getCacheObject(codeKey); if (code == null || !code.equals(vo.getCode())) { @@ -124,13 +125,13 @@ public class WxClerkController { @ClerkUserLogin @PostMapping("/user/add") - public R userAdd(@Valid @RequestBody PlayClerkUserByWxAddVo vo) { + public R userAdd(@Validated @RequestBody PlayClerkUserByWxAddVo vo) { String playUserId = ThreadLocalRequestDetail.getClerkUserInfo().getId(); PlayClerkUserInfoEntity userInfo = playClerkUserInfoService.selectById(playUserId); if (userInfo == null) { throw new CustomException("系统错误,用户不存在"); } - if (userInfo.getClerkState().equals("1")) { + if ("1".equals(userInfo.getClerkState())) { throw new CustomException("当前用户已经是店员"); } PlayClerkDataReviewInfoEntity dataReviewInfo = new PlayClerkDataReviewInfoEntity(); @@ -141,6 +142,8 @@ public class WxClerkController { if (!dataReviewInfoService.queryList(dataReviewInfo).isEmpty()) { throw new CustomException("已有申请未审核"); } + dataReviewInfo.setClarkAvatar(userInfo.getAvatar()); + dataReviewInfo.setClarkNickname(userInfo.getNickname()); dataReviewInfo.setContent(JSONObject.toJSONString(vo)); dataReviewInfo.setAddTime(new Date()); dataReviewInfoService.create(dataReviewInfo); @@ -150,7 +153,7 @@ public class WxClerkController { @ClerkUserLogin @PostMapping("/user/updateAvatar") - public R updateAvatar(@Valid @RequestBody PlayClerkUserAvatarVo vo) { + public R updateAvatar(@Validated @RequestBody PlayClerkUserAvatarVo vo) { PlayClerkUserInfoEntity userInfo = ThreadLocalRequestDetail.getClerkUserInfo(); PlayClerkDataReviewInfoEntity dataReviewInfo = new PlayClerkDataReviewInfoEntity(); @@ -161,6 +164,8 @@ public class WxClerkController { if (!dataReviewInfoService.queryList(dataReviewInfo).isEmpty()) { throw new CustomException("已有申请未审核"); } + dataReviewInfo.setClarkAvatar(userInfo.getAvatar()); + dataReviewInfo.setClarkNickname(userInfo.getNickname()); dataReviewInfo.setContent(JSONObject.toJSONString(vo)); dataReviewInfo.setAddTime(new Date()); dataReviewInfoService.create(dataReviewInfo); @@ -169,7 +174,7 @@ public class WxClerkController { @ClerkUserLogin @PostMapping("/user/updateAlbum") - public R updateAlbum(@Valid @RequestBody PlayClerkUserAlbumVo vo) { + public R updateAlbum(@Validated @RequestBody PlayClerkUserAlbumVo vo) { PlayClerkUserInfoEntity userInfo = ThreadLocalRequestDetail.getClerkUserInfo(); PlayClerkDataReviewInfoEntity dataReviewInfo = new PlayClerkDataReviewInfoEntity(); dataReviewInfo.setPlayUserId(userInfo.getId()); @@ -178,14 +183,17 @@ public class WxClerkController { if (!dataReviewInfoService.queryList(dataReviewInfo).isEmpty()) { throw new CustomException("已有申请未审核"); } + dataReviewInfo.setClarkAvatar(userInfo.getAvatar()); + dataReviewInfo.setClarkNickname(userInfo.getNickname()); dataReviewInfo.setContent(JSONObject.toJSONString(vo)); + dataReviewInfo.setAddTime(new Date()); dataReviewInfoService.create(dataReviewInfo); return R.ok("申请成功"); } @ClerkUserLogin @PostMapping("/user/updateAudio") - public R updateAudio(@Valid @RequestBody PlayClerkUserAudioVo vo) { + public R updateAudio(@Validated @RequestBody PlayClerkUserAudioVo vo) { PlayClerkUserInfoEntity userInfo = ThreadLocalRequestDetail.getClerkUserInfo(); PlayClerkDataReviewInfoEntity dataReviewInfo = new PlayClerkDataReviewInfoEntity(); dataReviewInfo.setPlayUserId(userInfo.getId()); @@ -194,6 +202,9 @@ public class WxClerkController { if (!dataReviewInfoService.queryList(dataReviewInfo).isEmpty()) { throw new CustomException("已有申请未审核"); } + dataReviewInfo.setAddTime(new Date()); + dataReviewInfo.setClarkAvatar(userInfo.getAvatar()); + dataReviewInfo.setClarkNickname(userInfo.getNickname()); dataReviewInfo.setContent(JSONObject.toJSONString(vo)); dataReviewInfoService.create(dataReviewInfo); return R.ok("申请成功"); @@ -202,7 +213,7 @@ public class WxClerkController { @ClerkUserLogin @PostMapping("/user/updateOnlineState") - public R updateAudio(@Valid @RequestBody PlayClerkUserOnlineStateVo vo) { + public R updateAudio(@Validated @RequestBody PlayClerkUserOnlineStateVo vo) { String userId = ThreadLocalRequestDetail.getClerkUserInfo().getId(); PlayClerkUserInfoEntity entity = new PlayClerkUserInfoEntity(); entity.setOnlineState(vo.getOnlineState()); @@ -213,15 +224,15 @@ public class WxClerkController { @ClerkUserLogin @PostMapping("/user/updateCommodity") - public R updateAudio(@Valid @RequestBody PlayClerkCommodityEditVo vo) { - playClerkCommodityService.startStopClerkItem(vo.getCommodityType(), vo.getEnablingState()); + public R updateAudio(@Validated @RequestBody PlayClerkCommodityEditVo vo) { + playClerkCommodityService.startStopClerkItem(vo.getCommodityType(), vo.getEnablingState(), ThreadLocalRequestDetail.getClerkUserInfo().getId()); return R.ok("成功"); } @ClerkUserLogin @PostMapping("/user/updateOther") - public R updateOther(@Valid @RequestBody PlayClerkUserOtherVo vo) { + public R updateOther(@Validated @RequestBody PlayClerkUserOtherVo vo) { PlayClerkUserInfoEntity userInfo = ConvertUtil.entityToVo(vo, PlayClerkUserInfoEntity.class); userInfo.setId(ThreadLocalRequestDetail.getClerkUserInfo().getId()); playClerkUserInfoService.update(userInfo); @@ -242,27 +253,28 @@ public class WxClerkController { * 分页获取店员列表 * * @param vo PlayClerkUserInfoQueryVo - * @return 店员礼列表 + * @return 店员列表 */ - @PostMapping("/user/queryByPage") public R queryByPage(@RequestBody PlayClerkUserInfoQueryVo vo) { - IPage page = playClerkUserInfoService.selectPlayClerkUserInfoByPage(vo); - List resultVos = new ArrayList<>(); - for (PlayClerkUserInfoEntity record : page.getRecords()) { - PlayClerkUserListResultVo item = ConvertUtil.entityToVo(record, PlayClerkUserListResultVo.class); - List list = playClerkCommodityService.selectByUser(record.getId()).stream().map(PlayClerkCommodityEntity::getCommodityType).collect(Collectors.toList()); - item.setCommodity(list); - resultVos.add(item); - } + IPage page = playClerkUserInfoService.selectByPage(vo, customUserService.getLoginUserId()); + return R.ok(page); + } - IPage resultPage = new Page<>(); - resultPage.setRecords(resultVos); - // 设置分页参数 - resultPage.setCurrent(page.getCurrent()); - resultPage.setSize(page.getSize()); - resultPage.setTotal(resultVos.size()); // 假设total和实际情况一致 - return R.ok(resultPage); + + /** + * 获取推荐用户列表 + * + * @return 店员列表 + */ + @PostMapping("/user/queryByRecommend") + public R queryByRecommend() { + PlayClerkUserInfoQueryVo vo = new PlayClerkUserInfoQueryVo(); + vo.setPageNum(10); + vo.setPageSize(9999); + vo.setRecommendationState("1"); + IPage page = playClerkUserInfoService.selectByPage(vo, ""); + return R.ok(page); } /** @@ -278,14 +290,17 @@ public class WxClerkController { if (entity == null) { throw new CustomException("用户不存在"); } - List list = new ArrayList<>(); - list.add(new PlayGiftInfoEntity(IdUtil.fastSimpleUUID(), "礼物1", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 0, "0")); - list.add(new PlayGiftInfoEntity(IdUtil.fastSimpleUUID(), "礼物2", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 1, "0")); - list.add(new PlayGiftInfoEntity(IdUtil.fastSimpleUUID(), "礼物3", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 2, "1")); - list.add(new PlayGiftInfoEntity(IdUtil.fastSimpleUUID(), "礼物4", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 3, "1")); - list.add(new PlayGiftInfoEntity(IdUtil.fastSimpleUUID(), "礼物5", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 4, "1")); - - return R.ok(list); + Map result = new HashMap<>(); + List list = new ArrayList<>(); + list.add(new PlayGiftInfoVo(IdUtil.fastSimpleUUID(), "礼物1", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 0, "0")); + list.add(new PlayGiftInfoVo(IdUtil.fastSimpleUUID(), "礼物2", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 1, "0")); + list.add(new PlayGiftInfoVo(IdUtil.fastSimpleUUID(), "礼物3", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 2, "1")); + list.add(new PlayGiftInfoVo(IdUtil.fastSimpleUUID(), "礼物4", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 3, "1")); + list.add(new PlayGiftInfoVo(IdUtil.fastSimpleUUID(), "礼物5", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", 4, "1")); + result.put("list", list); + result.put("obtainedGift", list.size() - 1); + result.put("totalGift", list.size()); + return R.ok(result); } @@ -356,6 +371,7 @@ public class WxClerkController { entities.add(new PlayClarkUserEvaluateInfoEntity(IdUtil.fastSimpleUUID(), IdUtil.fastSimpleUUID(), "评价人3昵称", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", "评价内容", new Date(), IdUtil.fastSimpleUUID(), "店员昵称", IdUtil.fastSimpleUUID(), "文字语音条", "一小时")); entities.add(new PlayClarkUserEvaluateInfoEntity(IdUtil.fastSimpleUUID(), IdUtil.fastSimpleUUID(), "评价人4昵称", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", "评价内容", new Date(), IdUtil.fastSimpleUUID(), "店员昵称", IdUtil.fastSimpleUUID(), "文字语音条", "一小时")); entities.add(new PlayClarkUserEvaluateInfoEntity(IdUtil.fastSimpleUUID(), IdUtil.fastSimpleUUID(), "评价人5昵称", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", "评价内容", new Date(), IdUtil.fastSimpleUUID(), "店员昵称", IdUtil.fastSimpleUUID(), "文字语音条", "一小时")); + entities.add(new PlayClarkUserEvaluateInfoEntity(IdUtil.fastSimpleUUID(), IdUtil.fastSimpleUUID(), "评价人5昵称", "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/d8e929c041e94075b93cfc6338a83d4c/2024/04/15/fc09da2f923d46e6951292ff8f34f6aa.png", "评价内容", new Date(), IdUtil.fastSimpleUUID(), "店员昵称", IdUtil.fastSimpleUUID(), "文字语音条", "一小时", 5)); IPage resultPage = new Page<>(); resultPage.setRecords(entities); diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommodityController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommodityController.java new file mode 100644 index 0000000..5a86c3a --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommodityController.java @@ -0,0 +1,41 @@ +package com.starry.admin.modules.weichat.controller; + + +import com.starry.admin.modules.clear.module.entity.PlayClerkCommodityEntity; +import com.starry.admin.modules.clear.service.IPlayClerkCommodityService; +import com.starry.admin.modules.weichat.entity.PlayClarkCommodityTreeData; +import com.starry.common.result.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author admin + */ +@Slf4j +@RestController +@RequestMapping("/wx/commodity/") +public class WxCommodityController { + @Resource + private IPlayClerkCommodityService clerkCommodityService; + + @GetMapping("/getTree") + public R getTree(@RequestParam("userId") String userId) { + List commodityEntities = clerkCommodityService.selectByUser(userId); + Map> item = commodityEntities.stream().collect(Collectors.groupingBy(PlayClerkCommodityEntity::getCommodityName)); + List result = new ArrayList<>(); + for (Map.Entry> entry : item.entrySet()) { + PlayClarkCommodityTreeData treeData = new PlayClarkCommodityTreeData(entry.getKey(), entry.getValue()); + result.add(treeData); + } + return R.ok(result); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java index 7519596..1d197fc 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCommonController.java @@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; import com.starry.admin.common.exception.CustomException; import com.starry.admin.common.oss.service.IOssFileService; +import com.starry.admin.modules.system.entity.SysAdministrativeAreaDictInfoEntity; import com.starry.admin.modules.system.service.ISysAdministrativeAreaDictInfoService; import com.starry.admin.modules.weichat.service.WxAccessTokenService; import com.starry.admin.modules.weichat.utils.WxFileUtils; diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java index 54ed1ac..75f2127 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomController.java @@ -1,15 +1,36 @@ package com.starry.admin.modules.weichat.controller; -import com.starry.admin.modules.clear.service.IPlayClerkLevelInfoService; -import com.starry.admin.modules.clear.service.impl.PlayClerkUserInfoServiceImpl; +import com.starry.admin.common.aspect.CustomUserLogin; +import com.starry.admin.common.conf.ThreadLocalRequestDetail; +import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.balance.service.IPlayBalanceDetailsInfoService; +import com.starry.admin.modules.clear.module.entity.PlayClerkCommodityEntity; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserListResultVo; +import com.starry.admin.modules.clear.service.IPlayClerkCommodityService; +import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import com.starry.admin.modules.follow.service.IPlayCustomFollowInfoService; +import com.starry.admin.modules.gift.module.entity.PlayGiftInfoEntity; +import com.starry.admin.modules.gift.service.IPlayGiftInfoService; +import com.starry.admin.modules.order.service.IPlayOrderInfoService; +import com.starry.admin.modules.weichat.entity.PlayClerkFollowStateUpdate; +import com.starry.admin.modules.weichat.entity.PlayOrderInfoCommodityAdd; +import com.starry.admin.modules.weichat.entity.PlayOrderInfoGiftAdd; +import com.starry.admin.modules.weichat.entity.PlayOrderInfoRewardAdd; +import com.starry.admin.modules.weichat.service.WxCustomUserService; +import com.starry.admin.utils.MoneyUtils; import com.starry.common.result.R; +import com.starry.common.utils.ConvertUtil; +import com.starry.common.utils.StringUtils; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.math.BigDecimal; /** * @author admin @@ -21,11 +42,206 @@ public class WxCustomController { @Resource - private PlayClerkUserInfoServiceImpl playClerkUserInfoService; + private IPlayCustomUserInfoService customUserInfoService; + + @Resource + private IPlayBalanceDetailsInfoService playBalanceDetailsInfoService; + @Resource + private IPlayClerkUserInfoService clerkUserInfoService; + + @Resource + private IPlayGiftInfoService giftInfoService; + + @Resource + private IPlayClerkCommodityService clerkCommodityService; + @Resource + private IPlayCustomFollowInfoService playCustomFollowInfoService; + + + @Resource + private IPlayClerkCommodityService playClerkCommodityService; + + @Resource + private WxCustomUserService customUserService; + + @Resource + private IPlayOrderInfoService orderInfoService; + + /** + * 根据店员ID查询店员详细信息 + * + * @param id 店员ID + * @return 店员详细信息 + */ + @GetMapping("/queryClarkDetailedById") + public R queryClarkDetailedById(@RequestParam("id") String id) { + PlayClerkUserInfoEntity entity = clerkUserInfoService.selectById(id); + if (entity == null) { + throw new CustomException("用户不存在"); + } + PlayClerkUserListResultVo vo = ConvertUtil.entityToVo(entity, PlayClerkUserListResultVo.class); + vo.setAddress(entity.getCity()); + // 查询是否关注,未登录情况下,默认为未关注 + String loginUserId = customUserService.getLoginUserId(); + if (StringUtils.isNotEmpty(loginUserId)) { + vo.setFollowState(playCustomFollowInfoService.queryFollowState(loginUserId, vo.getId())); + } + //服务项目 + vo.setCommodity(playClerkCommodityService.getClerkCommodityList(vo.getId())); + return R.ok(vo); + } + + /** + * 查询店员详细信息 + */ + @CustomUserLogin + @GetMapping("/queryById") + public R queryById() { + String userId = ThreadLocalRequestDetail.getCustomUserInfo().getId(); + PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(userId); + return R.ok(customUserInfo); + } + + + /** + * 打赏店员 + */ + @CustomUserLogin + @PostMapping("/order/reward") + public R rewardToOrder(@Validated @RequestBody PlayOrderInfoRewardAdd vo) { + MoneyUtils.verificationTypeIsNormal(vo.getMoney()); + String userId = ThreadLocalRequestDetail.getCustomUserInfo().getId(); + PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(userId); + if (customUserInfo == null) { + throw new CustomException("用户身份异常"); + } + PlayClerkUserInfoEntity clerkUserInfo = clerkUserInfoService.selectById(vo.getClearId()); + if (clerkUserInfo == null) { + throw new CustomException("打赏对象不存在"); + } + if (new BigDecimal(vo.getMoney()).compareTo(customUserInfo.getAccountBalance()) > 0) { + throw new CustomException("余额不足"); + } + // 记录订单信息 + orderInfoService.createRewardOrder(new BigDecimal(vo.getMoney()), new BigDecimal(vo.getMoney()), userId); + + // 顾客减少余额 + customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(new BigDecimal(vo.getMoney()))); + playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(new BigDecimal(vo.getMoney())), "打赏", new BigDecimal(vo.getMoney()).multiply(new BigDecimal("-1"))); + + // 陪玩增加余额 + clerkUserInfoService.updateAccountBalanceById(clerkUserInfo.getId(), clerkUserInfo.getAccountBalance().add(new BigDecimal(vo.getMoney()))); + playBalanceDetailsInfoService.create("1", clerkUserInfo.getId(), clerkUserInfo.getAccountBalance(), clerkUserInfo.getAccountBalance().add(new BigDecimal(vo.getMoney())), "打赏", new BigDecimal(vo.getMoney()).multiply(new BigDecimal("1"))); + + return R.ok("成功"); + } + + + @CustomUserLogin + @PostMapping("/order/gift") + public R giftToOdder(@Validated @RequestBody PlayOrderInfoGiftAdd vo) { + int giftQuantity; + try { + giftQuantity = Integer.parseInt(vo.getGiftQuantity()); + } catch (Exception e) { + throw new CustomException("礼物数量异常"); + } + if (giftQuantity <= 0 || giftQuantity > 10000) { + throw new CustomException("礼物数量必须大于0并且小于1000"); + } + String userId = ThreadLocalRequestDetail.getCustomUserInfo().getId(); + PlayGiftInfoEntity giftInfo = giftInfoService.selectPlayGiftInfoById(vo.getGiftId()); + if (giftInfo == null) { + throw new CustomException("礼物不存在"); + } + PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(userId); + if (customUserInfo == null) { + throw new CustomException("用户身份异常"); + } + PlayClerkUserInfoEntity clerkUserInfo = clerkUserInfoService.selectById(vo.getClearId()); + if (clerkUserInfo == null) { + throw new CustomException("打赏对象不存在"); + } + BigDecimal money = giftInfo.getPrice().multiply(new BigDecimal(vo.getGiftQuantity())); + + if (money.compareTo(customUserInfo.getAccountBalance()) > 0) { + throw new CustomException("账号余额不足"); + } + // 记录订单信息 + + orderInfoService.createGiftOrder(vo.getGiftId(), giftInfo.getPrice(), vo.getGiftQuantity(), money, money, userId); + + // 顾客减少余额 + customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(money)); + playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(money), "赠送礼物", money.multiply(new BigDecimal("-1"))); + + // 陪玩增加余额 + clerkUserInfoService.updateAccountBalanceById(clerkUserInfo.getId(), clerkUserInfo.getAccountBalance().add(money)); + playBalanceDetailsInfoService.create("1", clerkUserInfo.getId(), clerkUserInfo.getAccountBalance(), clerkUserInfo.getAccountBalance().add(money), "赠送礼物", money.multiply(new BigDecimal("1"))); + + return R.ok("成功"); + } + + + @CustomUserLogin + @PostMapping("/order/commodity") + public R commodityToOdder(@Validated @RequestBody PlayOrderInfoCommodityAdd vo) { + int commodityId; + try { + commodityId = Integer.parseInt(vo.getCommodityQuantity()); + } catch (Exception e) { + throw new CustomException("礼物数量异常"); + } + if (commodityId <= 0 || commodityId > 10000) { + throw new CustomException("购买数量必须大于0并且小于1000"); + } + String userId = ThreadLocalRequestDetail.getCustomUserInfo().getId(); + + PlayClerkCommodityEntity clerkCommodity = clerkCommodityService.selectPlayClerkCommodityById(vo.getCommodityId()); + if (clerkCommodity == null) { + throw new CustomException("服务不存在"); + } + PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(userId); + if (customUserInfo == null) { + throw new CustomException("用户身份异常"); + } + PlayClerkUserInfoEntity clerkUserInfo = clerkUserInfoService.selectById(vo.getClearId()); + if (clerkUserInfo == null) { + throw new CustomException("打赏对象不存在"); + } + BigDecimal money = clerkCommodity.getCommodityPrice().multiply(new BigDecimal(vo.getCommodityQuantity())); + + if (money.compareTo(customUserInfo.getAccountBalance()) > 0) { + throw new CustomException("余额不足"); + } + // 记录订单信息 + + orderInfoService.createOrdinaryOrder("2", "0", clerkCommodity.getCommodityId(), clerkCommodity.getCommodityPrice(), vo.getCommodityQuantity(), money, money, userId); + + // 顾客减少余额 + customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().subtract(money)); + playBalanceDetailsInfoService.create("0", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().subtract(money), "打赏", money.multiply(new BigDecimal("-1"))); + // 陪玩增加余额 + clerkUserInfoService.updateAccountBalanceById(clerkUserInfo.getId(), clerkUserInfo.getAccountBalance().add(money)); + playBalanceDetailsInfoService.create("1", clerkUserInfo.getId(), clerkUserInfo.getAccountBalance(), clerkUserInfo.getAccountBalance().add(money), "下单", money.multiply(new BigDecimal("1"))); + + return R.ok("成功"); + } + + @CustomUserLogin + @PostMapping("/followState/update") + public R followStateUpdate(@Validated @RequestBody PlayClerkFollowStateUpdate vo) { + PlayClerkUserInfoEntity clerkUserInfo = clerkUserInfoService.selectById(vo.getClearId()); + if (clerkUserInfo == null) { + throw new CustomException("关注对象不存在"); + } + playCustomFollowInfoService.updateFollowState(ThreadLocalRequestDetail.getCustomUserInfo().getId(), vo.getClearId(), vo.getFollowState()); + return R.ok("修改成功"); + } } diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxGiftController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxGiftController.java new file mode 100644 index 0000000..a8b618f --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxGiftController.java @@ -0,0 +1,29 @@ +package com.starry.admin.modules.weichat.controller; + + +import com.starry.admin.modules.gift.service.IPlayGiftInfoService; +import com.starry.admin.modules.weichat.entity.PlayGiftInfoDto; +import com.starry.common.result.R; +import com.starry.common.utils.ConvertUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @author admin + */ +@Slf4j +@RestController +@RequestMapping("/wx/gift/") +public class WxGiftController { + @Resource + private IPlayGiftInfoService giftInfoService; + + @GetMapping("/listByAll") + public R rewardToOrder() { + return R.ok(ConvertUtil.entityToVoList(giftInfoService.listByAll(),PlayGiftInfoDto.class)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java index a24c01b..dd80aae 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java @@ -13,6 +13,8 @@ import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; import com.starry.admin.modules.weichat.entity.WxUserLoginVo; import com.starry.admin.modules.weichat.entity.WxUserQueryAddressVo; +import com.starry.admin.modules.weichat.service.WxCustomMpService; +import com.starry.admin.modules.weichat.service.WxCustomUserService; import com.starry.admin.modules.weichat.service.WxOauthService; import com.starry.admin.modules.weichat.service.WxTokenService; import com.starry.common.redis.RedisCache; @@ -20,10 +22,10 @@ import com.starry.common.result.R; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.bean.WxJsapiSignature; import me.chanjar.weixin.common.error.WxErrorException; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.validation.Valid; import java.util.Date; import static com.starry.common.constant.Constants.*; @@ -41,7 +43,7 @@ public class WxOauthController { @Resource - private WxCustomService wxCustomService; + private WxCustomMpService wxCustomMpService; @Resource private IPlayCustomUserInfoService customUserInfoService; @@ -66,7 +68,7 @@ public class WxOauthController { if (!StrUtil.isBlankIfStr(vo.getUrl())) { defaultAddress = vo.getUrl(); } - WxJsapiSignature wxJsapiSignature = wxCustomService.proxyWxMpService().createJsapiSignature(defaultAddress); + WxJsapiSignature wxJsapiSignature = wxCustomMpService.proxyWxMpService().createJsapiSignature(defaultAddress); return R.ok(wxJsapiSignature); } @@ -77,7 +79,7 @@ public class WxOauthController { if (!StrUtil.isBlankIfStr(vo.getUrl())) { defaultAddress = vo.getUrl(); } - String url = wxCustomService.proxyWxMpService().getOAuth2Service().buildAuthorizationUrl(defaultAddress, "snsapi_userinfo", "STATE"); + String url = wxCustomMpService.proxyWxMpService().getOAuth2Service().buildAuthorizationUrl(defaultAddress, "snsapi_userinfo", "STATE"); return R.ok(url); } @@ -88,7 +90,7 @@ public class WxOauthController { @PostMapping("/clark/login") - public R clerkLogin(@Valid @RequestBody WxUserLoginVo vo) { + public R clerkLogin(@Validated @RequestBody WxUserLoginVo vo) { String userId = wxOauthService.clarkUserLogin(vo.getCode()); PlayClerkUserInfoEntity entity = clerkUserInfoService.selectById(userId); if (entity == null) { @@ -107,7 +109,7 @@ public class WxOauthController { } @PostMapping("/clark/loginById") - public R loginById(@Valid @RequestBody WxUserLoginVo vo) { + public R loginById(@Validated @RequestBody WxUserLoginVo vo) { PlayClerkUserInfoEntity entity = clerkUserInfoService.selectById(vo.getCode()); if (entity == null) { throw new CustomException("用户不存在"); @@ -139,7 +141,7 @@ public class WxOauthController { if (!StrUtil.isBlankIfStr(vo.getUrl())) { defaultAddress = vo.getUrl(); } - String url = wxCustomService.proxyWxMpService().getOAuth2Service().buildAuthorizationUrl(defaultAddress, "snsapi_userinfo", "STATE"); + String url = wxCustomMpService.proxyWxMpService().getOAuth2Service().buildAuthorizationUrl(defaultAddress, "snsapi_userinfo", "STATE"); return R.ok(url); } @@ -150,7 +152,7 @@ public class WxOauthController { @PostMapping("/custom/login") - public R customLogin(@Valid @RequestBody WxUserLoginVo vo) { + public R customLogin(@Validated @RequestBody WxUserLoginVo vo) { String userId = wxOauthService.customUserLogin(vo.getCode()); PlayCustomUserInfoEntity entity = customUserInfoService.selectById(userId); if (entity == null) { @@ -168,6 +170,24 @@ public class WxOauthController { return R.ok(jsonObject); } + @PostMapping("/custom/loginById") + public R loginById1(@Validated @RequestBody WxUserLoginVo vo) { + PlayCustomUserInfoEntity entity = customUserInfoService.selectById(vo.getCode()); + if (entity == null) { + throw new CustomException("用户不存在"); + } + // 缓存租户信息 + String redisKey = "TENANT_INFO:" + entity.getId(); + redisCache.setCacheObject(redisKey, entity.getTenantId()); + JSONObject jsonObject = JSONObject.from(clerkUserInfoService.getVo(new PlayClerkUserInfoEntity())); + String tokenValue = tokenService.createWxUserToken(entity.getId()); + jsonObject.put("tokenValue", TOKEN_PREFIX + tokenValue); + jsonObject.put("tokenName", CLERK_USER_LOGIN_TOKEN); + jsonObject.put("loginDate", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + customUserInfoService.updateTokenById(entity.getId(), tokenValue); + return R.ok(jsonObject); + } + @GetMapping("/custom/logout") @CustomUserLogin diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxPlayController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxPlayController.java new file mode 100644 index 0000000..2db8694 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxPlayController.java @@ -0,0 +1,107 @@ +package com.starry.admin.modules.weichat.controller; + + +import cn.hutool.core.util.StrUtil; +import com.starry.admin.common.aspect.CustomUserLogin; +import com.starry.admin.common.conf.ThreadLocalRequestDetail; +import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.balance.service.IPlayBalanceDetailsInfoService; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import com.starry.admin.modules.order.service.IPlayOrderInfoService; +import com.starry.admin.modules.platform.entity.SysTenantEntity; +import com.starry.admin.modules.platform.service.impl.SysTenantServiceImpl; +import com.starry.admin.utils.SecurityUtils; +import com.starry.common.result.R; +import com.starry.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.math.BigDecimal; + +@Slf4j +@RestController +@RequestMapping("/wx/play/") +public class WxPlayController { + + + @Resource + private SysTenantServiceImpl tenantService; + + + @Resource + private IPlayCustomUserInfoService customUserInfoService; + + @Resource + private IPlayBalanceDetailsInfoService playBalanceDetailsInfoService; + + @Resource + private IPlayOrderInfoService orderInfoService; + + + @CustomUserLogin + @GetMapping("/custom/createOrder") + public R createOrder(@RequestParam("money") String money) { + if (StringUtils.isEmpty(money)) { + throw new CustomException("请求参数错误,money不能为空"); + } + + String tenantId = SecurityUtils.getTenantId(); + if (StrUtil.isBlankIfStr(tenantId)) { + throw new CustomException("系统错误,租户ID不能为空"); + } + SysTenantEntity entity = tenantService.selectSysTenantByTenantId(tenantId); + if (entity == null) { + throw new CustomException("系统错误,租户ID不能为空"); + } + + + String openId = ThreadLocalRequestDetail.getCustomUserInfo().getOpenid(); + //订单总金额,单位为分 + int totalFee = getTotalFee(money); +// String orderId = IdUtil.fastSimpleUUID(); +// String body = "body"; +// +// try { +// String id = WxPlayUtils.unifiedOrderJSAPI(openId, entity.getAppId(), entity.getMchId(), orderId, "127.0.0.1", body, SecurityUtils.getTenantId(), totalFee); +// return R.ok(id); +// } catch (Exception e) { +// log.error("创建支付订单失败,error=", e); +// throw new CustomException("创建支付订单失败," + e.getMessage()); +// } + + String userId = ThreadLocalRequestDetail.getCustomUserInfo().getId(); + PlayCustomUserInfoEntity customUserInfo = customUserInfoService.selectById(userId); + if (customUserInfo == null) { + throw new CustomException("用户身份异常"); + } + + orderInfoService.createRechargeOrder(new BigDecimal(totalFee / 100), new BigDecimal(totalFee / 100), userId); + customUserInfoService.updateAccountBalanceById(customUserInfo.getId(), customUserInfo.getAccountBalance().add(new BigDecimal(totalFee / 100))); + playBalanceDetailsInfoService.create("1", customUserInfo.getId(), customUserInfo.getAccountBalance(), customUserInfo.getAccountBalance().add(new BigDecimal(totalFee / 100)), "充值", new BigDecimal(totalFee / 100)); + + return R.ok("成功"); + } + + + /** + * @param money 金额,单位-元 + * @return 金额, 单位-分 + */ + public int getTotalFee(String money) { + int totalFee; + try { + totalFee = (int) Float.parseFloat(money) * 100; + } catch (Exception e) { + throw new CustomException("请求参数错误,money类型异常"); + } + if (totalFee <= 0 || totalFee > 1000000) { + throw new CustomException("请求参数错误,单笔支付金额必须大于0,且小于10000"); + } + return totalFee; + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClarkCommodityTreeData.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClarkCommodityTreeData.java new file mode 100644 index 0000000..be228d7 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClarkCommodityTreeData.java @@ -0,0 +1,40 @@ +package com.starry.admin.modules.weichat.entity; + +import com.starry.admin.modules.clear.module.entity.PlayClerkCommodityEntity; +import com.starry.common.utils.ConvertUtil; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 店员商品树状数据 + */ +@Data +public class PlayClarkCommodityTreeData { + + private String commodityType; + + + private List value; + + + public PlayClarkCommodityTreeData(String commodityType, List value) { + this.commodityType = commodityType; + this.value = ConvertUtil.entityToVoList(value, ClarkCommodityInfo.class); + } + + @Data + public static class ClarkCommodityInfo { + + private String id; + + private String commodityName; + + private BigDecimal commodityPrice; + + private String serviceDuration; + + + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkFollowStateUpdate.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkFollowStateUpdate.java new file mode 100644 index 0000000..41778fb --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkFollowStateUpdate.java @@ -0,0 +1,27 @@ +package com.starry.admin.modules.weichat.entity; + + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; + +/** + * 店员和陪玩关注状态 + * + * @author admin + */ +@Data +public class PlayClerkFollowStateUpdate { + + + /** + * 店员用户ID + */ + @NotBlank(message = "打赏对象不能为空") + private String clearId; + + @NotBlank(message = "关注状态不能为空") + @Pattern(regexp = "[01]", message = "关注状态必须为0或者1") + private String followState; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserByWxAddVo.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserByWxAddVo.java index 4a5960d..9673066 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserByWxAddVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserByWxAddVo.java @@ -82,6 +82,12 @@ public class PlayClerkUserByWxAddVo { @Size(min = 1, max = 5, message = "照片必须为1-5张") private List album; + + /** + * 个性签名 + */ + private String signature; + /** * 备注 */ diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserLoginResponseVo.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserLoginResponseVo.java index 9a3b815..9cdb7e8 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserLoginResponseVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserLoginResponseVo.java @@ -83,7 +83,7 @@ public class PlayClerkUserLoginResponseVo { /** * 标签 */ - private List labels = new ArrayList<>(); + private List label = new ArrayList<>(); /** * 分类 diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserOtherVo.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserOtherVo.java index 43effa4..05c51fa 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserOtherVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayClerkUserOtherVo.java @@ -53,7 +53,7 @@ public class PlayClerkUserOtherVo { /** * 标签 */ - private List labels = new ArrayList<>(); + private List label = new ArrayList<>(); /** * 分类 diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayGiftInfoDto.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayGiftInfoDto.java new file mode 100644 index 0000000..75753cb --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayGiftInfoDto.java @@ -0,0 +1,44 @@ +package com.starry.admin.modules.weichat.entity; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class PlayGiftInfoDto { + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 礼物名称 + */ + private String name; + + /** + * 礼物类型(0:盲盒,1:普通礼物) + */ + private String type; + + /** + * 礼物图片地址 + */ + private String url; + + /** + * 单价 + */ + private BigDecimal price; + + /** + * 价格单位 + */ + private String unit; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoCommodityAdd.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoCommodityAdd.java new file mode 100644 index 0000000..148feca --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoCommodityAdd.java @@ -0,0 +1,44 @@ +package com.starry.admin.modules.weichat.entity; + + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + * 新增赠礼订单实体 + * + * @author admin + */ +@Data +public class PlayOrderInfoCommodityAdd { + + + /** + * 店员用户ID + */ + @NotBlank(message = "打赏对象不能为空") + private String clearId; + + + @NotBlank(message = "商品ID不能为空") + private String commodityId; + + @NotBlank(message = "礼物数量不能为空") + private String commodityQuantity; + + + @NotBlank(message = "微信号不能为空") + private String weiChatCode; + + /** + * 优惠券ID列表 + */ + private List couponIds; + + /** + * 备注 + */ + private String remark; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoGiftAdd.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoGiftAdd.java new file mode 100644 index 0000000..cd904c8 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoGiftAdd.java @@ -0,0 +1,38 @@ +package com.starry.admin.modules.weichat.entity; + + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 新增赠礼订单实体 + * + * @author admin + */ +@Data +public class PlayOrderInfoGiftAdd { + + + /** + * 店员用户ID + */ + @NotBlank(message = "打赏对象不能为空") + private String clearId; + + + @NotBlank(message = "礼物ID不能为空") + private String giftId; + + @NotBlank(message = "礼物数量不能为空") + private String giftQuantity; + + + @NotBlank(message = "微信号不能为空") + private String weiChatCode; + + /** + * 备注 + */ + private String remark; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoRewardAdd.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoRewardAdd.java new file mode 100644 index 0000000..9807049 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayOrderInfoRewardAdd.java @@ -0,0 +1,33 @@ +package com.starry.admin.modules.weichat.entity; + + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 新增打赏订单实体 + */ +@Data +public class PlayOrderInfoRewardAdd { + + + /** + * 店员用户ID + */ + @NotBlank(message = "打赏对象不能为空") + private String clearId; + /** + * 打赏金额 + */ + @NotBlank(message = "打赏金额不能为空") + private String money; + + @NotBlank(message = "微信号不能为空") + private String weiChatCode; + + /** + * 备注 + */ + private String remark; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAccessTokenService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAccessTokenService.java index 6e82078..e5730f4 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAccessTokenService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAccessTokenService.java @@ -1,7 +1,6 @@ package com.starry.admin.modules.weichat.service; -import com.starry.admin.modules.weichat.controller.WxCustomService; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.stereotype.Service; @@ -19,7 +18,7 @@ public class WxAccessTokenService { @Resource - private WxCustomService wxCustomService; + private WxCustomMpService wxCustomMpService; /** @@ -28,7 +27,7 @@ public class WxAccessTokenService { * @return access_token */ public String getAccessToken() throws WxErrorException { - String token = wxCustomService.proxyWxMpService().getAccessToken(); + String token = wxCustomMpService.proxyWxMpService().getAccessToken(); log.error("token = " + token); //缓存业务处理 return token; diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxCustomMpService.java similarity index 94% rename from play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomService.java rename to play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxCustomMpService.java index a16d9f3..f72cd4c 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxCustomService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxCustomMpService.java @@ -1,4 +1,4 @@ -package com.starry.admin.modules.weichat.controller; +package com.starry.admin.modules.weichat.service; import cn.hutool.core.util.StrUtil; import com.starry.admin.common.exception.CustomException; @@ -14,7 +14,7 @@ import javax.annotation.Resource; @Slf4j @Service -public class WxCustomService { +public class WxCustomMpService { @Resource private WxMpService wxMpService; @@ -38,4 +38,6 @@ public class WxCustomService { wxMpService.addConfigStorage(entity.getAppId(), config); return wxMpService.switchoverTo(entity.getAppId()); } + + } diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxCustomUserService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxCustomUserService.java new file mode 100644 index 0000000..1db2196 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxCustomUserService.java @@ -0,0 +1,59 @@ +package com.starry.admin.modules.weichat.service; + +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import com.starry.common.constant.Constants; +import com.starry.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +@Slf4j +@Service +public class WxCustomUserService { + + + @Resource + private IPlayCustomUserInfoService customUserInfoService; + + + @Resource + private HttpServletRequest request; + + + @Resource + private WxTokenService tokenService; + + + /** + * 获取当前登录顾客ID + * + * @return 当前登录顾客ID + */ + public String getLoginUserId() { + String userToken = request.getHeader(com.starry.common.constant.Constants.CUSTOM_USER_LOGIN_TOKEN); + if (StringUtils.isEmpty(userToken)) { + return ""; + } + if (userToken.startsWith(com.starry.common.constant.Constants.TOKEN_PREFIX)) { + userToken = userToken.replace(Constants.TOKEN_PREFIX, ""); + } + // 解析token + String userId; + try { + userId = tokenService.getWxUserIdByToken(userToken); + } catch (Exception e) { + return ""; + } + PlayCustomUserInfoEntity entity = customUserInfoService.selectById(userId); + if (Objects.isNull(entity)) { + return ""; + } + return userToken.equals(entity.getToken()) ? userId : ""; + } + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java index 6f44e42..ade4c69 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java @@ -5,10 +5,11 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.starry.admin.common.exception.ServiceException; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.service.IPlayClerkLevelInfoService; import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomLevelInfoService; import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; -import com.starry.admin.modules.weichat.controller.WxCustomService; import com.starry.common.utils.ConvertUtil; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.bean.WxOAuth2UserInfo; @@ -17,6 +18,7 @@ import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Date; @Slf4j @Service @@ -24,7 +26,7 @@ public class WxOauthService { @Resource - private WxCustomService wxCustomService; + private WxCustomMpService wxCustomMpService; @Resource @@ -33,6 +35,12 @@ public class WxOauthService { @Resource private IPlayClerkUserInfoService clerkUserInfoService; + @Resource + private IPlayClerkLevelInfoService playClerkLevelInfoService; + + @Resource + private IPlayCustomLevelInfoService playCustomLevelInfoService; + /** * 微信用户登录 @@ -54,6 +62,7 @@ public class WxOauthService { PlayClerkUserInfoEntity entity = ConvertUtil.entityToVo(userInfo, PlayClerkUserInfoEntity.class); entity.setAvatar(userInfo.getHeadImgUrl()); entity.setId(IdUtil.fastSimpleUUID()); + entity.setLevelId(playClerkLevelInfoService.getDefaultLevel().getId()); clerkUserInfoService.create(entity); return entity.getId(); } else { @@ -81,7 +90,14 @@ public class WxOauthService { PlayCustomUserInfoEntity entity = ConvertUtil.entityToVo(userInfo, PlayCustomUserInfoEntity.class); entity.setAvatar(userInfo.getHeadImgUrl()); PlayCustomUserInfoEntity item = customUserInfoService.selectByOpenid(openId); - entity.setId(item != null ? item.getId() : IdUtil.fastSimpleUUID()); + if (item == null) { + entity.setId(IdUtil.fastSimpleUUID()); + entity.setRegistrationTime(new Date()); + entity.setLevelId(playCustomLevelInfoService.getDefaultLevel().getId()); + } else { + entity.setId(item.getId()); + } + entity.setLastLoginTime(new Date()); customUserInfoService.saveOrUpdate(entity); return entity.getId(); } @@ -101,7 +117,7 @@ public class WxOauthService { } synchronized (code.intern()) { try { - return wxCustomService.proxyWxMpService().getOAuth2Service().getAccessToken(code); + return wxCustomMpService.proxyWxMpService().getOAuth2Service().getAccessToken(code); } catch (WxErrorException e) { throw new RuntimeException(e); } @@ -140,7 +156,7 @@ public class WxOauthService { throw new ServiceException("获取微信授权异常,WxOAuth2AccessToken不能为空"); } try { - return wxCustomService.proxyWxMpService().getOAuth2Service().getUserInfo(token, null); + return wxCustomMpService.proxyWxMpService().getOAuth2Service().getUserInfo(token, null); } catch (WxErrorException e) { throw new RuntimeException(e); } diff --git a/play-admin/src/main/java/com/starry/admin/utils/MoneyUtils.java b/play-admin/src/main/java/com/starry/admin/utils/MoneyUtils.java new file mode 100644 index 0000000..0765826 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/utils/MoneyUtils.java @@ -0,0 +1,36 @@ +package com.starry.admin.utils; + + +import com.starry.admin.common.exception.CustomException; + +/** + * 金额辅助类 + */ +public class MoneyUtils { + + + /** + * 校验金钱值是否正常 + * + * @param money 金钱值 + */ + public static void verificationTypeIsNormal(String money) { + if (money == null || money.isEmpty()) { + throw new CustomException("金额类型异常"); + } + float item; + try { + item = Float.parseFloat(money); + } catch (Exception e) { + throw new CustomException("金额类型异常"); + } + if (item < 0f) { + throw new CustomException("金额不能小于0"); + } + if (item > Integer.MAX_VALUE) { + throw new CustomException("金额超出计算范围"); + } + } + + +} diff --git a/play-admin/src/main/resources/mapper/order/OrderDetailsInfoMapper.xml b/play-admin/src/main/resources/mapper/order/OrderDetailsInfoMapper.xml deleted file mode 100644 index 01a78cf..0000000 --- a/play-admin/src/main/resources/mapper/order/OrderDetailsInfoMapper.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - select id, - order_id, - commodity_id, - commodity_type, - commodity_money, - remake, - updated_by, - created_time, - created_by, - deleted, - version - from order_details_info - - - - - - \ No newline at end of file diff --git a/play-admin/src/main/resources/mapper/order/OrderInfoMapper.xml b/play-admin/src/main/resources/mapper/order/OrderInfoMapper.xml deleted file mode 100644 index f69071a..0000000 --- a/play-admin/src/main/resources/mapper/order/OrderInfoMapper.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - select id, - tenant_id, - order_status, - order_type, - place_type, - first_order, - refund_type, - order_money, - purchaser_by, - purchaser_time, - reviewed_by, - reviewed_time, - reviewed_remark, - updated_time, - updated_by, - created_time, - created_by, - deleted, - version - from order_info - - - - - - \ No newline at end of file diff --git a/play-admin/src/main/resources/play.properties b/play-admin/src/main/resources/play.properties new file mode 100644 index 0000000..b89dfc6 --- /dev/null +++ b/play-admin/src/main/resources/play.properties @@ -0,0 +1,14 @@ +#微信公众号或者小程序等的appid +wx.play.appId:xxxxxxxxxxxxx +#微信支付商户号 +wx.play.mchId:xxxxxxxxxxxxx +# 证书 +wx.play.apiclient_key.pem:xxxxxxxxx +# 证书 +wx.play.apiclient_cert.pem:xxxxxxxxx +# apiV3key +wx.play.apiV3key:xxxxxxxxxxxxxxxxxx +#支付回调通知地址 +wx.play.returnUrl:http://xxxxxxxxxx/wxPay/callBack +# 退款回调地址 +wx.play.refundUrl:http://xxxxxxxxxx/wxPay/refund diff --git a/play-common/src/main/java/com/starry/common/domain/BaseEntity.java b/play-common/src/main/java/com/starry/common/domain/BaseEntity.java index fd7a314..f4866cc 100644 --- a/play-common/src/main/java/com/starry/common/domain/BaseEntity.java +++ b/play-common/src/main/java/com/starry/common/domain/BaseEntity.java @@ -3,6 +3,7 @@ package com.starry.common.domain; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.Version; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; @@ -36,10 +37,13 @@ public class BaseEntity implements Serializable { private String createdBy; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField(fill = FieldFill.INSERT) @ApiModelProperty(value = "创建时间") private Date createdTime; + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField(fill = FieldFill.UPDATE) @ApiModelProperty(value = "更新时间") private Date updatedTime; @@ -52,7 +56,6 @@ public class BaseEntity implements Serializable { @ApiModelProperty(value = "数据版本") private Long version; - /** * 搜索值 */ diff --git a/play-common/src/main/java/com/starry/common/redis/RedisCache.java b/play-common/src/main/java/com/starry/common/redis/RedisCache.java index bbddcf6..1360506 100644 --- a/play-common/src/main/java/com/starry/common/redis/RedisCache.java +++ b/play-common/src/main/java/com/starry/common/redis/RedisCache.java @@ -1,5 +1,6 @@ package com.starry.common.redis; +import org.springframework.dao.QueryTimeoutException; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; @@ -26,7 +27,12 @@ public class RedisCache { */ public T getCacheObject(final String key) { ValueOperations operations = redisTemplate.opsForValue(); - return (T) operations.get(key); + try { + return (T) operations.get(key); + } catch (QueryTimeoutException e) { + throw new RuntimeException("系统错误,通讯异常"); + } + } /** diff --git a/pom.xml b/pom.xml index 486e6f4..716f465 100644 --- a/pom.xml +++ b/pom.xml @@ -186,23 +186,12 @@ - com.github.binarywang - weixin-java-common - ${weixin-java.version} - - - - com.github.binarywang - weixin-java-miniapp - ${weixin-java.version} - - - - com.github.binarywang - weixin-java-pay - ${weixin-java.version} + com.github.wxpay + wxpay-sdk + 0.0.3 + org.redisson redisson-spring-boot-starter