diff --git a/.gitignore b/.gitignore index 09bdfeaa..0e4d448b 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,5 @@ nbdist/ !*/build/*.java !*/build/*.html -!*/build/*.xml \ No newline at end of file +!*/build/*.xml +/get-pip.py diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ClewController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ClewController.java index ad19ac8e..8934b407 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ClewController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ClewController.java @@ -2,9 +2,11 @@ package com.ruoyi.web.controller.system; import java.security.GeneralSecurityException; import java.security.Key; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.domain.entity.SysUser; @@ -283,4 +285,23 @@ public class ClewController extends BaseController return "system/clew/changeUser"; } + @PostMapping("/changeBatchUser") + @ResponseBody + public AjaxResult changeBatchUser(Clew clew) + { + if(StringUtils.isEmpty(clew.getIds())){ + return AjaxResult.error("请选择线索!"); + } + clew.setIdList(Arrays.stream(clew.getIds().split(",")).map(Long::parseLong).collect(Collectors.toList())); + return toAjax(clewService.updateBatchClew(clew)); + } + + @GetMapping("/changeBatchUser/{clewIds}") + public String changeBatchUser(@PathVariable("clewIds") String ids, ModelMap mmap) + { + mmap.put("clewIds", ids); + mmap.put("users", sysUserService.selectUserList(new SysUser())); + return "system/clew/changeBatchUser"; + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/NoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/NoticeController.java index afa65460..f8a46abe 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/NoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/NoticeController.java @@ -18,6 +18,7 @@ import com.ruoyi.system.domain.ClewPhone; import com.ruoyi.system.domain.NoticeRequest; import com.ruoyi.system.domain.OppoCheck; import com.ruoyi.system.service.IClewPhoneService; +import com.ruoyi.web.core.config.GlobalLogHelper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -134,6 +135,27 @@ public class NoticeController { log.info("请求{}的属性{}", url, content); String s = HttpUtils.sendPost(url, content, headerMap); log.info("请求{}的响应{}", url, s); + }else if("xiaomi".equalsIgnoreCase(request.getFrom())){ + String imei = request.getImei(); + String oaid = request.getOaid(); + String ua = "Dalvik/2.1.0 (Linux; U; Android 11; M2012K11AC Build/RKQ1.200826.002)"; + String clientIp = "127.0.0.1"; + long convTime = System.currentTimeMillis(); + String convType = "APP_PAY_NEW"; + long appId = 1545362; + int customerId = 1545362; + String singKey = "IIUWoEaMXlzctOqk"; + String encryptKey = "FkqMqeKVbCaeSGBI"; + GlobalLogHelper.UploadInfo uploadInfo = GlobalLogHelper.UploadInfo.builder() + .imei(imei) + .oaid(oaid) + .ua(ua) + .clientIp(clientIp) + .convTime(convTime).convType(convType) + .appId(appId).customerId(customerId).signKey(singKey).encryptKey(encryptKey).build().genInfo(); + log.info("请求xiaomi的属性{}", uploadInfo.getFinalUrl()); + String s = HttpUtils.sendGet(uploadInfo.getFinalUrl()); + log.info("请求xiaomi的响应{}", s); }else { log.info("短信请求接口入参:{}", request); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/GlobalLogHelper.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/GlobalLogHelper.java new file mode 100644 index 00000000..089bbb64 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/GlobalLogHelper.java @@ -0,0 +1,131 @@ +package com.ruoyi.web.core.config; + +import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; +import lombok.Builder; +import lombok.Data; +import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; + +import java.math.BigInteger; +import java.net.URLEncoder; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.List; + +/** + * lombok 1.16.16. + */ +public class GlobalLogHelper { + + @Data + @Builder + public static class UploadInfo { + //info设备信息 + private String imei; + private String oaid; + private long convTime; + private String clientIp; + private String ua; + private long adId; + //conversion转化信息 + private long appId; + private int customerId; + private String convType; + private String signKey; + private String encryptKey; + //生成的信息 + //最终url + private String finalUrl; + //最终生成的info + private String finalInfo; + //queryString 设备信息 + private String queryString; + private String property; + private String baseData; + //md5后的sign值 + private String signature; + + private final static String HOST = "http://trail.e.mi.com"; + private final static String PATH = "/global/test"; + + @SneakyThrows + public UploadInfo genInfo() { + List kvParam = new ArrayList<>(); + if (StringUtils.isNotBlank(this.imei)) { + kvParam.add("imei=" + URLEncoder.encode(this.imei, "UTF-8")); + } + if (StringUtils.isNotBlank(this.oaid)) { + kvParam.add("oaid=" + URLEncoder.encode(this.oaid, "UTF-8")); + } + if (this.convTime > 0) { + kvParam.add("conv_time=" + URLEncoder.encode(String.valueOf(this.convTime), "UTF-8")); + } + if (StringUtils.isNotBlank(this.clientIp)) { + kvParam.add("client_ip=" + URLEncoder.encode(this.clientIp, "UTF-8")); + } + if (StringUtils.isNotBlank(this.ua)) { + kvParam.add("ua=" + URLEncoder.encode(this.ua, "UTF-8")); + } + if (this.adId > 0) { + kvParam.add("ad_id=" + URLEncoder.encode(String.valueOf(this.adId), "UTF-8")); + } + + try { + //1.按照顺序使用 & 拼接key=urlEncode(value),queryString + this.queryString = String.join("&", kvParam); + //2.按照顺序使用 & 拼接签名密钥signKey 和 urlEncode(queryString),得到property + this.property = this.signKey + "&" + URLEncoder.encode(this.queryString, "UTF-8"); + //3. 将字符串(property) 进行md5(property)加密,得到32位小写字符串signature + this.signature = getMd5Digest(this.property); + } catch (Exception ignored) { + + } + //4.按照顺序使用 & 拼接 queryString(注意是第一个步骤生成的) 和 sign=signature + this.baseData = this.queryString + "&sign=" + this.signature; + //5.baseData进行加密 Base64(simple_xor{base_data, encrypt_key}),得到info信息 + this.finalInfo = encrypt(this.baseData, this.encryptKey); + this.finalUrl = HOST + PATH + + "?appId=" + URLEncoder.encode(String.valueOf(this.appId), "UTF-8") + + "&info=" + URLEncoder.encode(this.finalInfo, "UTF-8") + + "&conv_type=" + URLEncoder.encode(this.convType, "UTF-8") + + "&customer_id=" + URLEncoder.encode(String.valueOf(this.customerId), "UTF-8"); + + return this; + } + + //对baseData进行加密 Base64(simple_xor{base_data, encrypt_key}) + public static String encrypt(String info, String key) { + try { + if (StringUtils.isEmpty(info) || StringUtils.isEmpty(key)) { + return null; + } + //6.1 base_data, encrypt_key 异或加密 + char[] infoChar = info.toCharArray(); + char[] keyChar = key.toCharArray(); + + byte[] resultChar = new byte[infoChar.length]; + for (int i = 0; i < infoChar.length; i++) { + resultChar[i] = (byte) ((infoChar[i] ^ keyChar[i % keyChar.length]) & 0xFF); + } + //6.2 Base64 编码 + return Base64.encode(resultChar); + } catch (Exception e) { + return null; + } + } + + //md5 加密得到32位小写字符串. + public static String getMd5Digest(String pInput) { + try { + MessageDigest lDigest = MessageDigest.getInstance("MD5"); + lDigest.update(pInput.getBytes("UTF-8")); + BigInteger lHashInt = new BigInteger(1, lDigest.digest()); + return String.format("%1$032x", lHashInt); + } catch (Exception e) { + + } + return ""; + } + } + +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/system/clew/changeBatchUser.html b/ruoyi-admin/src/main/resources/templates/system/clew/changeBatchUser.html new file mode 100644 index 00000000..0fa908d1 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/system/clew/changeBatchUser.html @@ -0,0 +1,30 @@ + + + + + + +
+
+ +
+ +
+ +
+
+
+
+ + + + + diff --git a/ruoyi-admin/src/main/resources/templates/system/clew/clew.html b/ruoyi-admin/src/main/resources/templates/system/clew/clew.html index a1a0ed56..29813129 100644 --- a/ruoyi-admin/src/main/resources/templates/system/clew/clew.html +++ b/ruoyi-admin/src/main/resources/templates/system/clew/clew.html @@ -49,6 +49,9 @@
+ + 批量分配 + 添加 @@ -249,6 +252,18 @@ var url = prefix + '/changeUser/' + clewId; $.modal.open("选择客服", url, '800', '300'); } + + function changeBatchUser(){ + table.set(); + var rows = $.common.isEmpty(table.options.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns(table.options.uniqueId); + if (rows.length == 0) { + $.modal.alertWarning("请至少选择一条记录"); + return; + } + $.modal.confirm("确认分配吗?", function() { + $.modal.open("选择客服", prefix + '/changeBatchUser/' + rows.join(), '800', '300'); + }) + } \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/Clew.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Clew.java index 8d51e079..9ec0fa48 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/Clew.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Clew.java @@ -1,6 +1,8 @@ package com.ruoyi.system.domain; import java.util.Date; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import com.ruoyi.common.annotation.Excel; @@ -20,6 +22,10 @@ public class Clew extends BaseEntity /** 主键 */ private Long id; + private String ids; + + private List idList; + /** 广告主 */ @Excel(name = "广告主") private Long company; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClewMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClewMapper.java index 5d3dcfc5..8674d4bf 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClewMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/ClewMapper.java @@ -43,6 +43,8 @@ public interface ClewMapper */ public int updateClew(Clew clew); + public int updateBatchClew(Clew clew); + /** * 删除线索 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/IClewService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/IClewService.java index 8f085f11..d9c68d84 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/IClewService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/IClewService.java @@ -43,6 +43,8 @@ public interface IClewService */ public int updateClew(Clew clew); + public int updateBatchClew(Clew clew); + /** * 批量删除线索 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClewServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClewServiceImpl.java index 24fa7ff0..13826b5d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClewServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/ClewServiceImpl.java @@ -89,6 +89,13 @@ public class ClewServiceImpl implements IClewService return clewMapper.updateClew(clew); } + @Override + public int updateBatchClew(Clew clew) + { + clew.setUpdateTime(DateUtils.getNowDate()); + return clewMapper.updateBatchClew(clew); + } + /** * 批量删除线索 * diff --git a/ruoyi-system/src/main/resources/mapper/system/ClewMapper.xml b/ruoyi-system/src/main/resources/mapper/system/ClewMapper.xml index 98a59fbd..9eea340e 100644 --- a/ruoyi-system/src/main/resources/mapper/system/ClewMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/ClewMapper.xml @@ -210,6 +210,22 @@ where id = #{id} + + update clew + + sale_id = #{saleId}, + + + + and id in + + #{id} + + + + + delete from clew where id = #{id}